从用户控件 WPF 调用主窗口中的公共函数

Ori*_*nlk 1 c# wpf xaml user-controls winforms

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

<Grid>
    <local:RegularUnit x:Name="ucRegularUnit" Grid.Row="0" />
    <local:Actions x:Name="ucActions" Grid.Row="1" />
    // .....
</Grid>
Run Code Online (Sandbox Code Playgroud)

我在主窗口中有一个公共函数,我想在单击用户控件中的按钮后调用它。在搜索了一些解决方案后,我找到了一种在我的用户控件类中获取父窗口实例的方法,但是在我使用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()
    }
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.cs

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

    public void myFunction()
    {
        // Do Some Stuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dir*_*irk 6

您无法调用myFunctionparentWindow因为它不是标准 WPFWindow类的成员,而是您自定义的MainWindow.

您可以做的是将结果转换为Window.GetWindow(this)to MainWindow,例如

MainWindow parentWindow = (MainWindow)  Window.GetWindow(this);
parentWindow.myFunction();
Run Code Online (Sandbox Code Playgroud)

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

您应该做的是向父控件可以订阅的用户控件添加一个事件。

public event EventHandler SerialNumberSearch;

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

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