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

时间:2010-11-30 17:44:12

标签: c# wpf modal-dialog

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

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

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

我已经尝试了很多东西,现在我要向聪明人伸出援手:)。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

蒂莫西的答案很好。我只需要为我的scenerio添加以下内容

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)

  1. 为了显示模态窗口,请始终使用ShowDialog()

  2. 使用Close()代替Hide()

  3. 处理FormClosing事件:

  4.     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)