从用户控件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调用主窗口中的公共功能的主要内容,如果未能解决你的问题,请参考以下文章