如何在没有关闭的情况下"隐藏()"模态WPF窗口?

Tim*_*uri 11 c# wpf modal-dialog

我有一个WPF窗口,它作为一种"通知程序窗口"在后台线程上运行...当一个事件被引发时,它会显示一条消息......用户点击"贪睡"按钮然后我打电话 this.Visibility = Visibility.Collapsed

我隐藏窗口的那一刻(通过调用this.Hide()或设置Visibility如上所述)......"ShowDialog()"代码释放窗口并关闭它.

这绝对是WPF代码中的一个错误(我通过反射器识别出来的......)但我的问题仍然存在.有没有人能够为这个问题找到解决办法?

我已经尝试了很多东西,现在我正在接触到聪明的人:)

Ter*_*ver 5

您无法隐藏模态对话框.这就像是在问:"我如何反向达到100英里/小时?" 你没有,你开车前进.

使用Show,而不是ShowDialog.或者,当需要再次显示时,您可以简单地重新显示ShowDialog.

  • 好吧,汽车类比很蹩脚,但关键在于:根据定义,模态对话框是一个显示的对话框,它阻止用户与应用程序的任何其他部分交互,直到完成对话框.如何隐藏这样的野兽甚至有意义? (3认同)
  • 例如,AutoCAD 等 CAD 程序中使用隐藏对话框来在画布上进行用户选择来选择点。 (2认同)

Tim*_*uri 1

好吧,很快 - 我的老板(他是一个老 C++ 傻瓜)就找到了答案。

我的后台线程(设置为 STA 模式)内的代码:

// Show dialog - keeps the thread open and shows the window! Yay!!!
new BeamUI.Notifier.NotifierWindow().ShowDialog();
Run Code Online (Sandbox Code Playgroud)

这是修改,奇怪的是,它完美地工作了:)

// Show... hmm, that shows the window... but how do I keep this thread open?
new BeamUI.Notifier.NotifierWindow().Show();

// ZOMG - a line of code that JUST keeps the thread (and msgpump) going!!!
System.Windows.Threading.Dispatcher.Run();
Run Code Online (Sandbox Code Playgroud)

就是这样。

这种事情让我讨厌 C++ 人,并且让我想说“如果你一开始就把它构建正确,我就不必寻找解决方法了!” (j/k)