【问题标题】:Fire Event from dynamically loaded XAML来自动态加载的 XAML 的触发事件
【发布时间】:2023-03-11 08:17:01
【问题描述】:

我在我的 WPF 应用程序运行时加载了一个 XAML 文件(页面):

<Frame x:Name="xamlNode"></Frame>

后面的代码:

FileStream s = new FileStream("Page1.xaml", FileMode.Open);  
xamlNode.Source = new Uri("Page1.xaml", UriKind.RelativeOrAbsolute);
xamlNode.NavigationUIVisibility = NavigationUIVisibility.Hidden;
s.Close();

我觉得奇怪的第一件事是代码是在 Page1.xaml.cs 上运行的。这个 XAML 文件不应该没有任何业务逻辑吗?不过这正是我需要的。

但是我怎样才能在我的父 WPF 应用程序中从 Page1.xaml.cs 中引发事件,例如按下按钮?

我的问题的根源是:我需要一个用户在 VS 中设计简单的“页面”,然后在运行时加载。但是当用户在该页面上完成某些操作时,我需要一个事件。

【问题讨论】:

  • 这应该是可能的。您是否使用过 viemodel 并使用过 MVVM 绑定?您是否将该视图模型绑定到页面的数据上下文?
  • 我没有视图模型
  • 好的,所以,在您的用例中,页面有一个按钮。谁来定义当用户单击该按钮时会发生什么?它是在应用程序中定义的还是在页面上定义的?
  • “这个 XAML 文件不应该没有任何业务逻辑吗”?这取决于开发商。您应该查看 MVVM。这是开发基于 XAML 的 UI 应用程序的推荐模式。您想在何时何地向谁发起活动?
  • 我在 Page1.xaml.cs 中有验证逻辑,并希望在 Page1 有效时在我的主应用程序上引发事件。

标签: c# wpf xaml


【解决方案1】:

首先,对于您的问题,您可以使用UIElement.AddHandler 方法处理任何视觉后代引发的任何路由事件。假设您已经为Frame.Loaded 事件注册了一个处理程序。

private void Frame_Loaded(object sender, RoutedEventArgs e)
{
    ((UIElement)sender).AddHandler(Buttion.ClickEvent, (RoutedEventHandler)((s, e1) =>
    {
        Button btn = (Button)e1.OriginalSource;
        if (btn.Name == "same kind of id")
        {
            // handle the event.
        }
    }));
}

对于Page1.xaml代码执行问题,如果你编译了xaml文件,代码将被执行,因为你将页面指定为FrameSource。我必须指出FileStream 与加载Page1.xaml 无关。另一方面,如果您使用松散的 xaml 作为框架的来源,则任何代码都不应该用于 xaml。因此,请检查 Page1.xaml 的构建操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多