我的WPF应用程序中有一个MainWindow
和一个user-control
。我想在MainWindow
中调用user-control
的函数,而不是creating new instance of MainWindow
。为此我做了用户控件的主窗口父级。我在下面编写了这段代码,用于调用Parent的功能。
儿童用户控制
public partial class AppLogo : UserControl
{
public MainWindow myparent { get; set; }
private void activate_Click_1(object sender, RoutedEventArgs e)
{
myparent.function();
}
. . .
}
父窗口:
public MainWindow()
{
InitializeComponent();
AppLogo childWindow = new AppLogo();
. . .
问题:
Window
的父user-control
?Yes
,那么为什么会产生Object Reference is Null
错误。No it is not possible
那么我该如何实现这一目标。 因为需要在我的应用程序中创建用户控件。 答案 0 :(得分:1)
我假设空引用适用于myparent
上的AppLogo
属性?
在此行AppLogo childWindow = new AppLogo();
之后添加一句childWindow.myparent = this;
答案 1 :(得分:1)
如果您想在UserControl
中引用MainWindow
,请使用以下代码:
MainWindow mw = Application.Current.MainWindow as MainWindow;
http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow.aspx
private void activate_Click_1(object sender, RoutedEventArgs e)
{
MainWindow mw = Application.Current.MainWindow as MainWindow;
if(mw != null)
{
mw.function();
}
}
第二个解决方案:
在您的代码中,您应该在myparent
构造函数中设置MainWindow
属性:
public MainWindow()
{
InitializeComponent();
AppLogo childWindow = new AppLogo();
childWindow.myparent = this;
...
}
在activate_Click_1
事件处理程序中,检查myparent
是否为空的好习惯:
private void activate_Click_1(object sender, RoutedEventArgs e)
{
if(myparent != null)
myparent.function();
else
...
}
答案 2 :(得分:0)
您可以按照建议引入子父依赖,但是由于您没有实例化MainWindow,因此在调用myparent.function()时应该会出现空引用异常;
首先,您需要实例化MainWindow,然后通过调用AppLogo .set_myparent来设置子父关系,只有这样您的调用才会失败。
答案 3 :(得分:0)
您需要将对MainWindow实例的引用作为参数传递给AppLogo的构造函数,然后将其设置为AppLogo的MainWindow变量。
public AppLogo(MainWindow mainWindow)
{
this.myparent = mainWindow;
}
答案 4 :(得分:0)
如果您在UserControl
内直接找到Window
,则其Parent
媒体资源会引用您的窗口。
当您尝试访问包含null
值的字段时,会调用该异常。它包含null
,因为没有人放置任何其他内容。您可能想要设置它:
AppLogo childWindow = new AppLogo();
childWindow.myparent = <something>;
您只需要递归搜索UserControl的父母,直到获得Window
的实例,这将是您的目标。
public static Window GetWindow(FrameworkElement element)
{
return (element.Parent as Window) ?? GetWindow(element.Parent);
}