如何获取或设置主应用程序窗口

本文介绍如何获取或设置 Windows Presentation Foundation(WPF)的主应用程序窗口。 在 WPF 应用程序中实例化的第一个 Window 会自动通过 Application 设置为主应用程序窗口。 主窗口通过Application.MainWindow属性进行引用。

项目模板通常会将 Application.StartupUri 设置为应用程序中的 XAML 文件,例如 _Window1.xaml_。 这是应用程序实例化并显示的第一个窗口,它将成为主窗口。

小窍门

应用程序的默认行为是关闭最后一个窗口时关闭。 此行为由 Application.ShutdownMode 属性控制。 或者,您可以配置使应用程序在MainWindow关闭时关闭。 将Application.ShutdownMode设置为OnMainWindowClose以启用此行为。

在 XAML 中设置主窗口

生成 WPF 应用程序的模板通常将 Application.StartupUri 属性设置为 XAML 文件。 此属性非常有用,因为:

  1. 它可以轻松地更改为项目中的其他 XAML 文件。
  2. 自动实例化并显示指定的窗口。
  3. 指定的窗口将成为 Application.MainWindow.
<Application x:Class="MainApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MainApp"
             StartupUri="Window1.xaml">
    
</Application>

可以将Application.MainWindow设置为一个XAML声明的窗口,而不是使用Application.StartupUri。 但是,此处指定的窗口不会显示,并且必须设置其可见性。

<Application x:Class="MainApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MainApp">

    <Application.MainWindow>
        <local:Window2 Visibility="Visible" />
    </Application.MainWindow>
</Application>

谨慎

如果同时设置属性 Application.StartupUriApplication.MainWindow 属性,则应用程序启动时将显示这两个窗口。

此外,还可以使用该 Application.Startup 事件打开窗口。 有关详细信息,请参阅 “使用启动事件”打开窗口

在代码中设置主窗口

应用程序实例化的第一个窗口将自动成为主窗口,并设置为 Application.MainWindow 该属性。 若要设置其他主窗口,请将此属性更改为窗口:

Application.Current.MainWindow = new Window2();

Application.Current.MainWindow.Show();
Application.Current.MainWindow = New Window2()

Application.Current.MainWindow.Show()

如果应用程序从未创建过窗口的实例,则以下代码在功能上等效于前面的代码:

var appWindow = new Window2();

appWindow.Show();
Dim appWindow As New Window2()

appWindow.Show()

创建窗口对象实例后,会将该实例分配给Application.MainWindow

获取主窗口

可以通过查看Application.MainWindow属性来访问选择为主窗口的窗口。 单击按钮时,以下代码显示一个消息框,其中包含主窗口的标题:

private void Button_Click(object sender, RoutedEventArgs e) =>
    MessageBox.Show($"The main window's title is: {Application.Current.MainWindow.Title}");
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    MessageBox.Show($"The main window's title is: {Application.Current.MainWindow.Title}")
End Sub

另请参阅