我正在开发一个WPF应用程序,我需要在控件中获取到指向应用程序主窗口的指针。我正在使用Caliburn Micro框架。
Application.Current.MainWindow
是 null
如何在Caliburn Micro中获取到应用程序的MainWindow
引用?
我正在开发一个WPF应用程序,我需要在控件中获取到指向应用程序主窗口的指针。我正在使用Caliburn Micro框架。
Application.Current.MainWindow
是 null
如何在Caliburn Micro中获取到应用程序的MainWindow
引用?
有趣,我刚在另一篇帖子中回答了这个问题... 尝试在MainWindow.xaml.cs
文件的Loaded
事件中设置Application.Current.MainWindow
属性:
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Application.Current.MainWindow = this;
}
1. 理解Application.Current.MainWindow
当你的应用程序打开第一个窗口(MainWindow.xaml
)时,该窗口被设置为Application.Current.MainWindow
。当该窗口关闭时,另一个当前打开的窗口会被设置为Application.Current.MainWindow
。如果没有打开的窗口,则Application.Current.MainWindow
将被设置为null。
例如,如果你在启动时打开了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模式中,你不应该直接从viewmodels中访问views。如果你这样做了,你将破坏主要的MVVM关注点,如关注点分离、可测试性等等。问题是,为什么你想要MVVM。
如果你想在MainWindow
中执行某些操作,你应该在MainWindowViewModel
中执行该操作。如果窗口已经打开,它将反映在ViewModel中。如果没有打开,则不必反映更改。MainWindowViewModel
不应直接引用MainWindow
实例。
OfType<MainWindow>()
是缺失的棘手部分。 - Liero