从用户控件WPF调用主窗口中的公共功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从用户控件WPF调用主窗口中的公共功能相关的知识,希望对你有一定的参考价值。

我有一个主窗口,其中包含一些在WPF XAML中初始化的用户控件 MainWindow.xaml。

<Grid>
    <local:RegularUnit x:Name="ucRegularUnit" Grid.Row="0" />
    <local:Actions x:Name="ucActions" Grid.Row="1" />
    // .....
</Grid>

我在主窗口中有一个公共功能,我想在用户控件中单击一个按钮后调用它。在搜索了一些解决方案之后,我找到了一种在我的User Control类中获取父窗口实例的方法,但是当我使用parentWindow.myFunction()时它无法找到该函数。

用户控制RegularUnit.cs

public partial class RegularUnit : UserControl
{
    public RegularUnit()
    {
        InitializeComponent();
    }

    private void Button_SearchSerialNumber_Click(object sender, RoutedEventArgs e)
    {
        Window parentWindow = Window.GetWindow(this);
        //parentWindow.    //Can't find the function myFunction()
    }
}

MainWindow.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public void myFunction()
    {
        // Do Some Stuff...
    }
}

我做错了什么,我该如何解决?

答案

你不能在myFunction上调用parentWindow,因为它不是标准WPF Window类的成员,而是你的自定义MainWindow

你可以做的是将Window.GetWindow(this)的结果转换为MainWindow,就像

MainWindow parentWindow = (MainWindow)  Window.GetWindow(this);
parentWindow.myFunction();

然而,这是一个非常糟糕的类设计,因为现在您的用户控件依赖于嵌入在特定窗口中。

您应该做的是将事件添加到父控件可以订阅的用户控件。

public event EventHandler SerialNumberSearch;

private void Button_SearchSerialNumber_Click(object sender, RoutedEventArgs e)
{
    var handler = SerialNumberSearch;
    if (handler != null) handler(this, EventArgs.Empty);
}

当然,您可以使用不同类型的EventHandler,具体取决于您的需求。

另一答案
System.Windows.Application.Current.Windows.OfType<YourWindow>().SingleOrDefault(x => x.IsActive).YourPublicMethod();

虽然上面的代码是一种混乱的方式,但它仍然完成了工作。

以上是关于从用户控件WPF调用主窗口中的公共功能的主要内容,如果未能解决你的问题,请参考以下文章

wpf怎么实现主窗口向用户控件传值?

wpf中用户控件更改期间的动画

从用户控件中导航WPF选项卡控件?

如何从 UserControl 访问 WPF 页面中的公共变量?

使用 MVVM 和视图模型通信的 WPF 窗口模式对话框

WPF MVVM 将用户控件绑定到主窗口视图模型