应用程序主窗口,它是如何以及它的主要用途?

时间:2017-05-18 10:03:18

标签: c# wpf mvvm

我有一个具有登录启动窗口的应用程序,如果登录正确,则打开应用程序的主窗口。

当登录正确时,我以这种方式打开新窗口(我使用的是MVVM模式):

PrincipalViewModel miPrincipalViewModel = new PrincipalViewModel();
PrincipalView miPrincipalView = new PrincipalView();
miPrincipalView.DataContext = miPrincipalViewModel;

App.Current.MainWindow.DataContext = null;
App.Current.MainWindow.Close();

miPrincipalView.Show();

在这种情况下,我不设置新的主窗口。另一种选择是这段代码:

PrincipalViewModel miPrincipalViewModel = new PrincipalViewModel();
PrincipalView miPrincipalView = new PrincipalView();
miPrincipalView.DataContext = miPrincipalViewModel;

App.Current.MainWindow.DataContext = null;
App.Current.MainWindow.Close();

App.Current.MainWindow = miPrincipalView;
miPrincipalView.Show();

在第二种情况下,我将主窗口属性设置为应用程序的主窗口,因为登录窗口已关闭。

但是我没有看到两种情况下的行为有任何不同,所以我想知道什么是真正的MainWindow以及它的用途和含义。

谢谢。

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您不再拥有实际的MainWindow,但除非您依赖Application.Current.MainWindow属性在应用程序的某个位置返回对窗口的有效引用,或者如果您有任何问题,否则不应该成为问题已将Application.ShutdownMode属性设置为OnMainWindowClose

默认值为OnLastWindowClose,这意味着无论如何,当您关闭新窗口时,应用程序将按预期关闭。

正如MSDN上的文档所说"某些应用程序的生命周期可能不依赖于主窗口或最后一个窗口何时关闭,或者可能根本不依赖于窗口。"

答案 1 :(得分:0)

以下是来自MSDN

的App.Current.MainWindow的部分内容
  

MainWindow会自动设置对第一个Window的引用   要在AppDomain中实例化的对象。你可以指定一个   通过设置MainWindow分配另一个Windows来设置不同的主窗口   对象为MainWindow属性。如果是ShutdownMode属性的话   Application对象设置为OnMainWindowClose,关闭main   窗口导致应用程序关闭。可以设置   如果应用程序的主窗口不是,则来自XAML的MainWindow属性   通过设置StartupUri属性生成的窗口   XAML。 XAML方法的两个限制是:您可以指定   要么仅使用XAML窗口,要么仅使用仅限XAML的NavigationWindow作为主要窗口   窗口。您必须设置窗口的Visibility属性   指定,否则不会显示。对第一个的引用   要实例化的Window对象也作为第一项添加   Windows集合。如果MainWindow随后设置为   引用一个不同的Window,项目的位置   对主窗口的引用会改变,同时项目的顺序也会改变   Windows保持不变。因此,请始终使用MainWindow进行引用   到主窗口而不是Windows中的第一项。

我认为您只需要在App.Current.ShutdownMode之前将ShutdownMode.OnExplicitShutdown设置为App.Current.MainWindow.Close();,并在您想关闭该应用时调用App.Current.Shutdown

MSDN Application.ShutdownMode