我试图保持一个 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();
}
}
7 回答
我想如果你改变窗口的可见性而不是关闭窗口,你可以这样做 . 你'd need to do that in the Closing() event and then cancel the close. If you allow the close to happen you certainly can' t重新打开一个关闭的窗口 - 来自here:
在那之后,窗口将再次无效 .
我不认为这是值得的努力 - 每次创建一个新窗口并没有太大的性能影响,你不太可能引入难以调试的bug /内存泄漏 . (另外,当应用程序关闭时,您需要确保它关闭并释放它的资源)
只是读到你正在使用ShowDialog(),这将使窗口模态并简单地隐藏它将不会将控制返回到父窗口 . 我怀疑用模态窗口可以做到这一点 .
如果我没错,您可以取消该窗口的结束事件,而不是将隐藏的可见性设置为隐藏
当我们尝试显示关闭的Window时,我们将得到以下异常 .
"Cannot set Visibility or call Show, ShowDialog, or WindowInteropHelper.EnsureHandle after a Window has closed."
因此,为了处理这种情况,如果我们使用窗口的 Visibility 选项会更好 . 我们需要将窗口的可见性设置为 Hidden 或 Collapsed ,而不是直接关闭它 .
this.Visibility = System.Windows.Visibility.Collapsed或Hidden;
如果我们想再次显示它,只需将可见性设置为 Visible
this.Visibility = System.Windows.Visibility.Visible;
如果您取消关闭事件并设置visibility = hidden,则可以覆盖此问题
我的处理方式如下:
我有某种类似的问题 . 所以模态对话框,但在该对话框中你有一个“选择”按钮,需要切换到主窗体(最好没有关闭模态对话框),从那里选择一些区域,然后返回到带有选择信息的模态对话框 . 我尝试使用无模式对话框/ show / hide进行一些操作,之后找不到任何好的(易于编码)解决方案,使用win32本机函数调用以某种方式编写hacky方法 . 我测试过 - 它与winforms和xaml一起使用效果很好 .
问题本身也不是必须的 - 因此用户按下“选择”,然后他可能会忘记他正在选择某些内容,并返回到相同的不同选择对话框,这可能导致两个或更多相同对话框的实例 .
我试图通过使用静态变量(实例/父)来解决这个问题 - 如果你有纯winforms或纯wpf技术,你可能从instance.Parent或instance.Owner得到父 .
相同的范例可能会出现无模式对话问题,因为每个选择函数调用链都会占用堆栈,最终可能会出现堆栈溢出,或者您可能会遇到管理父窗口状态(启用/禁用它)的问题 .
所以我认为这是解决问题的非常轻量级的解决方案,因此它看起来相当复杂 .