如何获取或设置主应用程序窗口 (WPF .NET)
本文将教授如何获取或设置 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