应用程序MainWindow在WPF中为空(使用Caliburn Micro)

我正在开发一个WPF应用程序,我需要指向一个控件内的应用程序的主窗口。 我正在使用Caliburn Micro。

Application.Current.MainWindownull

如何在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 。 当您关闭LoginWindowApplication.Current.MainWindow可以是Window1

2.访问MainWindow实例

如果要访问MainWindow类的实例,则应执行以下操作: Application.Current.Windows.OfType().FirstOrDefault();

但是,如果未打开MainWindow,则它将返回null。 不要试图解决这个问题 – 如果MainWindow尚未打开,或者它已经关闭,则不应该访问它。

3. MVVM

在MVVM模式中,您不应直接从视图模型访问视图。 如果你这样做了,你就会打破主要的MVVM问题,例如关注点分离,可测试性等等。问题是,为什么你想要mvvm。

如果要在MainWindow执行某些操作,则应在MainWindow执行操作。 如果窗口打开,它将反映ViewModel中的更改。 如果不是,则不必反映更改。 MainWindowViewModel不应该直接引用MainWindow实例。