如何获取或设置主应用程序窗口 (WPF .NET)

本文将教授如何获取或设置 Windows Presentation Foundation (WPF) 的主应用程序窗口。 在 WPF 应用程序中实例化的第一个 WindowApplication 自动设置为主应用程序窗口。 使用 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.StartupUri 属性和 Application.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

另请参阅