澄清 WPF Window.Show() 和 Window.Close() 以及它们如何与 Multiple Windows 一起工作
Clarification on WPF Window.Show() and Window.Close() and how they work with Multiple Windows
我遇到的问题看起来很多人过去都遇到过
处理 WPF 是我想隐藏或关闭 MainWindow
打开新 Window 时的应用程序。我想这样做的原因是因为为它制作标签对我来说看起来不太整洁,尤其是我设计 UI 的方式。我试过使用 newWindow.Show() 和 oldWindow.Close(),但是当程序 运行s 时,旧的 Window 在应该关闭的时候仍然显示。我也尝试过这样做,以便在调用 newWindow 时隐藏 oldWindow 。它们都产生完全相同的结果。据我了解,您实际上无法关闭 MainWindow,因为程序需要它才能继续 运行。所以,我知道我想走隐藏 MainWindow 的路线,但正如您在我的问题中看到的那样,它没有按预期工作。
任何人都可以解释我做错了什么或为
指点
我可以使用的替代方法?
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();
}
}
}
}
我还尝试将事件处理程序更改为:
private void listBox_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
if (listBox.SelectedIndex == 1)
{
MainWindow main = new MainWindow();
ScienceWindow sci = new ScienceWindow();
sci.Show();
main.Visibility = System.Windows.Visibility.Hidden;
}
}
You cannot actually close the MainWindow because it is needed for the
program to continue to run
这个断言是错误的,尽管它是默认行为,您可以将 Application
class 的 ShutdownMode
设置为 OnLastWindowClose
或 OnExplicitShutdown
.然后关闭主 window 不会结束您的应用程序。
此外,您可能想使用 Hide
方法而不是 Close
,因为您似乎想稍后恢复主 window。
关于您发布的代码,我不太明白您在做什么。您正在创建一个新的 MainWindow 并在之后关闭它,而不是试图关闭 已经存在的 MainWindow。
您似乎在使用页面 - 您确定要创建 新 windows,而不是简单地在 [=33= 上的不同页面之间导航]一样 window?
无论如何,这是您的方法的一个可能实现:
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;
}
我遇到的问题看起来很多人过去都遇到过 处理 WPF 是我想隐藏或关闭 MainWindow 打开新 Window 时的应用程序。我想这样做的原因是因为为它制作标签对我来说看起来不太整洁,尤其是我设计 UI 的方式。我试过使用 newWindow.Show() 和 oldWindow.Close(),但是当程序 运行s 时,旧的 Window 在应该关闭的时候仍然显示。我也尝试过这样做,以便在调用 newWindow 时隐藏 oldWindow 。它们都产生完全相同的结果。据我了解,您实际上无法关闭 MainWindow,因为程序需要它才能继续 运行。所以,我知道我想走隐藏 MainWindow 的路线,但正如您在我的问题中看到的那样,它没有按预期工作。 任何人都可以解释我做错了什么或为
指点我可以使用的替代方法?
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();
}
}
}
}
我还尝试将事件处理程序更改为:
private void listBox_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
if (listBox.SelectedIndex == 1)
{
MainWindow main = new MainWindow();
ScienceWindow sci = new ScienceWindow();
sci.Show();
main.Visibility = System.Windows.Visibility.Hidden;
}
}
You cannot actually close the MainWindow because it is needed for the program to continue to run
这个断言是错误的,尽管它是默认行为,您可以将 Application
class 的 ShutdownMode
设置为 OnLastWindowClose
或 OnExplicitShutdown
.然后关闭主 window 不会结束您的应用程序。
此外,您可能想使用 Hide
方法而不是 Close
,因为您似乎想稍后恢复主 window。
关于您发布的代码,我不太明白您在做什么。您正在创建一个新的 MainWindow 并在之后关闭它,而不是试图关闭 已经存在的 MainWindow。
您似乎在使用页面 - 您确定要创建 新 windows,而不是简单地在 [=33= 上的不同页面之间导航]一样 window?
无论如何,这是您的方法的一个可能实现:
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;
}