本文介绍如何获取或设置 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 文件。 此属性非常有用,因为:
- 它可以轻松地更改为项目中的其他 XAML 文件。
- 自动实例化并显示指定的窗口。
- 指定的窗口将成为 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