Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法重用已经关闭的WPF窗口实例_Wpf_Xaml - Fatal编程技术网

有没有办法重用已经关闭的WPF窗口实例

有没有办法重用已经关闭的WPF窗口实例,wpf,xaml,Wpf,Xaml,我有一个窗口实例,通过单击按钮调用wInstance.ShowDialog()来显示,然后按Alt+F4关闭窗口。现在的问题是我不能再调用wInstance.ShowDialog()。如何再次重复使用相同的窗口实例 例外情况: 窗口关闭后无法设置可见性或调用Show或ShowDialog。到底是什么原因使得使用同一窗口如此重要? 如果您使用的是MVVM,则可以将viewmodel重新用于新窗口。您需要覆盖wInstance OnClose方法,将窗口可见性设置为hidden并取消关闭事件 pr

我有一个窗口实例,通过单击按钮调用wInstance.ShowDialog()来显示,然后按Alt+F4关闭窗口。现在的问题是我不能再调用wInstance.ShowDialog()。如何再次重复使用相同的窗口实例

例外情况:
窗口关闭后无法设置可见性或调用Show或ShowDialog。

到底是什么原因使得使用同一窗口如此重要?
如果您使用的是MVVM,则可以将viewmodel重新用于新窗口。

您需要覆盖wInstance OnClose方法,将窗口可见性设置为hidden并取消关闭事件

 protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
    {
        this.Visibility = Visibility.Hidden;
        e.Cancel = true;
    }

我将窗口重用为使用treeview的对话框,客户端希望树分支保持打开状态,以便进行更多选择

覆盖用于重用,分支保持扩展状态


我没有使用视图模型来保持简单,因为它是一个只读选择对话框。但由于我似乎还不能清除选择,我可能不得不切换到视图模型。

但我想消除创建新窗口实例的成本。因此,检查是否存在可重用范围,并在实例上再次使用ShowDialog()。创建窗口是否有那么昂贵?Martin Doms的回答是正确的,但我自己对这个问题非常好奇。您是否可能高估了创建此视图的开销,尤其是在使用MVVM并保持VM的情况下?我的窗口很重,但速度很快,但我正在考虑重用它,因为在旧计算机或低端计算机上,显示它需要几毫秒的时间。很难注意到,但我希望它是即时的Hanks Martin,这是我前几天问自己的一个问题的答案。我在这里也有同样的问题,虽然这在我再次尝试使用窗口时阻止了异常,但它阻止了ShowDialog()在我预期的情况下返回true。您对此有什么建议吗?ShowDialog()的返回值表示如何处理该对话框。如果此信息对您很重要,那么您将需要在窗口关闭时实际处理它,因此您不应该取消关闭事件,而应该在您想要重新打开它时实例化一个新窗口。如果窗口的状态信息是重要的,考虑纪念品图案。可能的复制品不能是一个更新的帖子的复制品。那篇文章肯定是这篇文章的翻版吗?