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

8

我正在开发一个WPF应用程序,我需要在控件中获取到指向应用程序主窗口的指针。我正在使用Caliburn Micro框架。

Application.Current.MainWindownull

如何在Caliburn Micro中获取到应用程序的MainWindow引用?

2个回答

19

有趣,我刚在另一篇帖子中回答了这个问题... 尝试在MainWindow.xaml.cs文件的Loaded事件中设置Application.Current.MainWindow属性:

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    Application.Current.MainWindow = this;
}

这很有趣,我几分钟前刚看到那篇帖子。 - Kjell Derous
1
刚试了一下,设置之前我检查过它已经被设置了(但还是重新设置了一遍),但后来它又变成了null,有什么想法是什么原因导致的吗?据我所知,我的应用程序从未设置过它,那么是否有WPF通用场景会将其设置为null呢? - Adriaan Davel
抱歉,我不知道会发生任何这样的情况......这种情况从未发生过,但如果您使用任何第三方框架,它们可能因某种原因而这样做。 - Sheridan
1
Application.MainWindow会自动设置为应用程序中打开的第一个窗口。当该窗口关闭时,它将被设置为下一个打开的窗口,或者在没有打开的窗口的情况下设置为null。 - Liero

5

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实例。


我对WPF的经验非常有限,但第二点中的信息似乎不太准确。我认为WPF中不存在“MainWindow类”,而且[文档明确说明],第一项Application.Windows并不一定是主窗口:“如果MainWindow随后被设置为对不同窗口的引用,则具有对主窗口引用的项目的位置将更改,而Windows中项目的顺序保持不变。因此,始终使用MainWindow来引用主窗口,而不是Windows中的第一项。” - Tomasz Maczyński
@TomaszMaczyński:已修复,谢谢!这只是格式问题。这里的类型参数 OfType<MainWindow>() 是缺失的棘手部分。 - Liero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接