我今天遇到了问题,在尝试解决它时发现WPF中有些奇怪。
要查看问题,请创建新的WPF应用程序,添加按钮并单击事件:
private void Button_Click(object sender, RoutedEventArgs e)
{
var window = new MainWindow();
}
启动应用程序并关闭它而不单击按钮将起作用。
启动应用程序,单击按钮并关闭它 - 将无效。
应用程序将保留在内存中。几个月前我有similar issue,但是如果我使用它的解决方案,那么会发生另一个奇怪的事情:当退出应用程序时,Window.Closed
事件会因未显示的窗口被触发。
问题:实例化窗口时WPF做了什么?为什么我不能像其他任何类一样简单地实例化它?我必须一直显示它吗?
答案 0 :(得分:1)
我相信你是从错误的角度来看这个。如果您不打算显示它,则不需要以这种方式创建窗口。
您面临的问题是由于您在click事件上创建的窗口永远不会被处理(当您调用Close
时会发生这种情况),因此UI循环继续执行并且应用程序永远不会退出。 / p>
您可以通过在关闭外部/可见窗口时调用Close
来避免这种情况,
private Window window;
public MainWindow()
{
InitializeComponent();
}
public void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
window = new MainWindow();
}
protected override void OnClosed(EventArgs e)
{
if (window != null)
{
// Call Close on the window you created when the main main closes
window.Close();
}
base.OnClosed(e);
}
您需要使用私有字段,以便在调用OnClosed
事件时保留引用。
我使用简单的WPF应用程序对此进行了测试;但是,不应该在click事件上实例化相同的窗口类型(即MainWindow
)。我这样做是为了简单,但完全没必要。