我有一个WPF窗口,它在后台线程上作为一种“通知程序窗口”运行...当一个事件被引发时,它会显示一条消息......用户点击“贪睡”按钮然后我打电话this.Visibility = Visibility.Collapsed
我隐藏窗口的那一刻(通过调用this.Hide()
或如上所述设置Visibility
)......“ShowDialog()”代码释放窗口并关闭它。 / p>
这绝对是WPF代码中的一个错误(我通过反射器识别出来的......)但我的问题仍然存在。有没有人能够为这个问题找到解决办法?
我已经尝试了很多东西,现在我要向聪明人伸出援手:)。
答案 0 :(得分:5)
您无法隐藏模态对话框。这就像是在问:“我如何反向达到100英里/小时?”你没有,你开车前进。
使用Show,而不是ShowDialog。或者,当需要再次显示时,您可以简单地重新显示ShowDialog。
答案 1 :(得分:2)
window.Closed += new EventHandler(window_Closed);
window.Show();
System.Windows.Threading.Dispatcher.Run();
然后在事件......
void window_Closed(object sender, EventArgs e)
{
System.Windows.Threading.Dispatcher.ExitAllFrames();
}
我需要这样做,因为它在表单真正关闭后挂在Run上。
答案 2 :(得分:2)
为了显示模态窗口,请始终使用ShowDialog()
。
使用Close()
代替Hide()
。
处理FormClosing
事件:
private void OnFormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; this.Visible = false; }
答案 3 :(得分:0)
好的,并且尽快 - 我的老板(他是老C ++傻傻的家伙)想出了答案。
这里 我的后台线程中的代码(设置为STA模式):
// Show dialog - keeps the thread open and shows the window! Yay!!!
new BeamUI.Notifier.NotifierWindow().ShowDialog();
这是修改,奇怪的是,它完美无缺:)
// 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();
就是这样。
这种事情让我讨厌C ++人,并且让我只想说“如果你刚开始构建它,我就不用去寻找解决方法!” (J / K)