C# 关于WPF Window.Show()和Window.Close()以及它们如何处理多个窗口的说明

C# 关于WPF Window.Show()和Window.Close()以及它们如何处理多个窗口的说明,c#,wpf,navigation,window,C#,Wpf,Navigation,Window,我现在面临的问题,看起来就像很多人过去遇到的问题一样 处理WPF是我想隐藏或关闭 新窗口打开时的应用程序。我之所以想这样做,是因为为它制作标签在我看来并不整洁,特别是在我如何设计UI方面。我尝试过使用newWindow.Show()和oldWindow.Close(),但是当程序运行时,oldWindow仍在显示,而它本应关闭。我也尝试过使它在调用新窗口时隐藏旧窗口。它们都产生了完全相同的结果。据我所知,您实际上无法关闭主窗口,因为程序需要它才能继续运行。所以,我知道我想隐藏主窗口,但正如你从我

我现在面临的问题,看起来就像很多人过去遇到的问题一样 处理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;
}