如何实例化窗口而不显示它?

时间:2014-06-06 13:19:48

标签: c# wpf

我今天遇到了问题,在尝试解决它时发现WPF中有些奇怪。

要查看问题,请创建新的WPF应用程序,添加按钮并单击事件:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var window = new MainWindow();
}

启动应用程序并关闭它而不单击按钮将起作用。

启动应用程序,单击按钮并关闭它 - 将无效。

应用程序将保留在内存中。几个月前我有similar issue,但是如果我使用它的解决方案,那么会发生另一个奇怪的事情:当退出应用程序时,Window.Closed事件会因未显示的窗口被触发。

问题:实例化窗口时WPF做了什么?为什么我不能像其他任何类一样简单地实例化它?我必须一直显示它吗?

1 个答案:

答案 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)。我这样做是为了简单,但完全没必要。