C# 关于WPF Window.Show()和Window.Close()以及它们如何处理多个窗口的说明
我现在面临的问题,看起来就像很多人过去遇到的问题一样 处理WPF是我想隐藏或关闭 新窗口打开时的应用程序。我之所以想这样做,是因为为它制作标签在我看来并不整洁,特别是在我如何设计UI方面。我尝试过使用newWindow.Show()和oldWindow.Close(),但是当程序运行时,oldWindow仍在显示,而它本应关闭。我也尝试过使它在调用新窗口时隐藏旧窗口。它们都产生了完全相同的结果。据我所知,您实际上无法关闭主窗口,因为程序需要它才能继续运行。所以,我知道我想隐藏主窗口,但正如你从我的问题中看到的,它并没有按预期工作。 谁能解释一下我做错了什么,或者给我一个建议 我可以选择别的方法吗C# 关于WPF Window.Show()和Window.Close()以及它们如何处理多个窗口的说明,c#,wpf,navigation,window,C#,Wpf,Navigation,Window,我现在面临的问题,看起来就像很多人过去遇到的问题一样 处理WPF是我想隐藏或关闭 新窗口打开时的应用程序。我之所以想这样做,是因为为它制作标签在我看来并不整洁,特别是在我如何设计UI方面。我尝试过使用newWindow.Show()和oldWindow.Close(),但是当程序运行时,oldWindow仍在显示,而它本应关闭。我也尝试过使它在调用新窗口时隐藏旧窗口。它们都产生了完全相同的结果。据我所知,您实际上无法关闭主窗口,因为程序需要它才能继续运行。所以,我知道我想隐藏主窗口,但正如你从我
namespace WorkinProgress
{
/// <summary>
/// Interaction logic for EnglishLanguageSelection.xaml
/// </summary>
public partial class EnglishLanguageSelection : Page
{
public EnglishLanguageSelection()
{
InitializeComponent();
loadList();
}
private void loadList()
{
listBox.Items.Add("math");
listBox.Items.Add("science");
listBox.Items.Add("history");
listBox.Items.Add("english");
}
private void listBox_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
if (listBox.SelectedIndex == 1)
{
MainWindow main = new MainWindow();
ScienceWindow sci = new ScienceWindow();
NavigationService.Navigate(sci);
main.Close();
}
}
}
}
您实际上无法关闭主窗口,因为它是
要继续运行的程序
此断言是错误的,尽管它是默认行为,但您可以将应用程序
类的设置为OnLastWindowClose
或OnExplicitShutdown
。然后关闭主窗口不会结束应用程序
此外,您可能希望使用该方法而不是Close
,因为您似乎希望稍后恢复主窗口
关于你发布的代码,我不太明白你在做什么。您正在创建一个新的主窗口,并在创建后立即关闭它,而不是试图关闭现有的主窗口 您似乎正在使用页面-是否确实要创建新窗口,而不是简单地在同一窗口上的不同页面之间导航 无论如何,这里有一个可行的方法实现:
private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (listBox.SelectedIndex == 1)
{
ScienceWindow sci = new ScienceWindow();
sci.Show();
// Note: Better store the main window in a globally accessible place
// since you want to retrieve it once it is hidden to show it again
var main = Window.GetWindow(this);
main.Hide();
}
}
在App.xaml.cs中:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
ShutdownMode = ShutdownMode.OnLastWindowClose;
}
我之所以想要另一个窗口而不是添加页面,很大程度上是因为我正在处理的程序的结构。一旦你到达某个点,我想打开另一个窗口来清理空间,而不需要使用菜单栏。经过大量的研究和测试,我找到了解决方案。我调用Application.Current.MainWindow.Close()而不是在主菜单上使用Hide或Show方法;它按预期工作。不过,你的建议也行。你知道什么是
mainwindowmain=newmainwindow()代码>在您发布的代码中?基本上,您是在创建一个新的主窗口,而不是获取现有的主窗口-这就是您通过Application.Current.MainWindow
访问窗口所解决的问题。但这并不能改变一个事实,即您可能希望使用Hide而不是Close来修改应用程序的关机模式。我知道这是一种调用新主窗口而不是获取现有主窗口的方法。然而,访问现有的方法并不容易。我运行了一个测试,您在回答中描述的方法实际上比我提出的要快。所以,我正在修改我的代码以反映我的想法。
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
ShutdownMode = ShutdownMode.OnLastWindowClose;
}