我正在开发一个WPF应用程序,我需要指向控件内的主应用程序窗口。我正在使用Caliburn Micro。
Application.Current.MainWindow
是null
如何在Caliburn Micro中获得MainWindow
应用程序的引用?
答案 0 :(得分:14)
这很有趣,我刚刚在另一篇文章中回答了这个问题...尝试在Application.Current.MainWindow
文件的Loaded
事件中设置MainWindow.xaml.cs
属性:
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Application.Current.MainWindow = this;
}
答案 1 :(得分:3)
<强> 1。了解Application.Current.MainWindow
当您的应用程序打开第一个窗口(MainWindow.xaml
)时,窗口将设置为Application.Current.MainWindow
。当窗口关闭时,另一个当前打开的窗口设置为Application.Current.MainWindow
。如果没有打开的窗口,则Application.Current.MainWindow设置为null。
e.g。如果您在启动时打开LoginWindow
,则Application.Current.MainWindow
将为LoginWindow
。当您关闭LoginWindow
时,Application.Current.MainWindow
可以是Window1
。
<强> 2。访问MainWindow实例
如果要访问MainWindow类的实例,则应执行以下操作:
Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
但是,如果未打开MainWindow,则它将返回null。不要尝试解决这个问题 - 如果MainWindow尚未打开,或者它已经关闭,则不应该访问它。
第3。 MVVM 强>
在MVVM模式中,您不应直接从视图模型访问视图。如果你这样做了,你就会打破主要的MVVM问题,例如关注点分离,可测试性等等。问题是,为什么你想要mvvm。如果您想在MainWindow
中执行某些操作,则应在MainWindowViewModel
上执行操作。如果窗口打开,它将反映ViewModel中的更改。如果不是,则不必反映更改。 MainWindowViewModel
不应直接引用MainWindow
实例。