WPF:关闭后无法重用窗口

Jer*_*ing 45 .net c# wpf singleton window

我试图Window在需要的时候保留一个实例ShowDialog.这在winforms中找到了,但是在WPF中我接受了这个例外:

System.InvalidOperationException:无法在Window关闭后设置Visibility或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle.

有没有办法在WPF中做这样的事情?

MyWindow.Instance.ShowDialog();

public class MyWindow : Window
{
    private static MyWindow _instance;

    public static MyWindow Instance
    {
        if( _instance == null )
        {
            _instance = new Window();
        }
        return _instance();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ris 47

我想如果你改变窗口的可见性而不是关闭窗口,你可以这样做.您需要在Closing()事件中执行此操作,然后取消关闭.如果你允许关闭发生,你肯定无法重新打开一个关闭的窗口 - 从这里:

如果未取消Closing事件,则会发生以下情况:

...

窗口创建的非托管资源将被释放.

在那之后,窗口将再次无效.

我不认为这是值得的努力 - 每次创建一个新窗口并没有太大的性能影响,你不太可能引入难以调试的bug /内存泄漏.(另外,当应用程序关闭时,您需要确保它关闭并释放它的资源)


只是读到你正在使用ShowDialog(),这将使窗口模态并简单地隐藏它将不会将控制返回到父窗口.我怀疑用模态窗口可以做到这一点.

  • 实际上,一旦你包括所有布局,初始化等的成本,创建一个新窗口是一个相当昂贵的主张.对于有些复杂的窗口,这可以显着提高性能 - 我已经尝试过了;-). (10认同)

Rai*_*ain 40

如果我没错,您可以取消该窗口的结束事件,而不是将隐藏的可见性设置为隐藏

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        e.Cancel = true;
        this.Visibility = Visibility.Hidden;
    } 
Run Code Online (Sandbox Code Playgroud)

  • 如果有人遇到类似的问题,我必须将 Closing="Window_Closing" 添加到我的窗口标记中的 XAML (2认同)

小智 5

尝试这个:

protected override void OnClosing(CancelEventArgs e)
{
    this.Visibility = Visibility.Hidden;
    e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)