【问题标题】:Is there a way to re-use an already closed WPF Window instance有没有办法重新使用已经关闭的 WPF Window 实例
【发布时间】:2010-11-17 13:08:57
【问题描述】:

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

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

【问题讨论】:

标签: wpf xaml


【解决方案1】:

究竟是什么让使用同一个窗口如此重要? 如果您使用的是 MVVM,则可以将视图模型重用于新窗口。

【讨论】:

  • 但我想消除创建新窗口实例的成本。因此检查是否存在可重用范围并在实例上再次使用 ShowDialog()。
  • 您的窗口创建成本高吗?
  • Martin Doms 的回答是正确的,但我本人对这个问题很好奇。您是否可能高估了创建此视图的开销,尤其是在您使用 MVVM 并保留 VM 的情况下?
  • 我的窗口很重但速度很快,但是我想重用它,因为在旧机器或低端机器上显示需要几毫秒。它几乎不引人注意,但我希望它是即时的
【解决方案2】:

您需要重写 wInstance OnClosing 方法以将窗口可见性设置为隐藏并取消关闭事件。

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

【讨论】:

  • 谢谢马丁,这是我前几天问自己的一个问题的答案。
  • 我在这里遇到了同样的问题,虽然这在我尝试再次使用窗口时停止了异常,但它阻止了 ShowDialog() 在我期望的时候返回 true。您对此有什么建议吗?
  • ShowDialog() 的返回表明对话框是如何被处理掉的。如果此信息对您很重要,那么您将需要在关闭窗口时实际处理它,因此您不应该取消关闭事件,而是在您想要重新打开它时实例化一个新窗口。如果窗口的状态信息很重要,请考虑备忘录模式。
【解决方案3】:

我将一个窗口重用为一个使用树视图的对话框,并且客户希望树枝保持打开状态以进行更多选择。

覆盖可重复使用,分支保持扩展。

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

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 2018-06-06
    • 1970-01-01
    • 2016-10-18
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多