2012-12-07 78 views
0

我有一个简单的WPF窗体与文本框和按钮,失去焦点它只是简单地显示一个消息框。 我的代码看起来像这样WPF窗体和Windows消息传递的模态对话框

private void TextBox_LostFocus(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine("Lost Focus 1"); 
     Dispatcher.BeginInvoke(new Action(() => 
       { 
        //Uncomment below lines to get button click 
        //Thread.Sleep(100); 
        //System.Windows.Forms.Application.DoEvents(); 
        MessageBox.Show("Lost focus"); 
       } 
      )); 
    } 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine("Button_Click"); 
    } 

如果我的文本框具有焦点,当我点击按钮,然后如果显示的消息框按钮点击不解雇,但如果我之前调用Application.DoEvents()我显示消息框,然后我按钮点击被解雇。

我的实际应用程序有点复杂,但我试图用一个简单的文本框和一个按钮来模拟这种行为。在实际的应用程序之一,我的后台工作线程发布调度器上显示模式消息框(或甚至WPF形式)和队列中的任何用户界面挂起的消息似乎由messagebox处理(我怀疑),例如,如果我点击画布控制在理想情况下,我得到“鼠标按下”和“鼠标释放”但如果莫代尔消息框,这2个消息之间进来,然后我只得到“鼠标按下”和“鼠标“”消息丢失。

注意:我没有看到这种行为没有看到非模态对话框的情况下。

另外就我个人而言,如果有人能指出我关于窗体窗体如何处理窗口消息泵的好的文章的情况下模态对话框和非模态对话框将有所帮助。

+0

我会尝试处理ReportProgess中的消息框。没有承诺它会解决它,但是我会尝试。 – Paparazzi

+0

它具有相同的效果,问题是模态对话框获取Windows消息 – Ankit

回答

0

您可以使用BeginInvoke()方法的DispatcherPriority参数设置您的Dispatcher操作所需的优先级。我通常使用的最低优先级为ApplicationIdle,因此允许分派器在处理您的所有未决操作之前完成处理。

Dispatcher.BeginInvoke(new Action(() => 
{ 
    MessageBox.Show("Lost focus"); 
}), DispatcherPriority.ApplicationIdle); 
+0

这适用于某些情况。部分它的解决方案,但仍然有什么办法可以限制模式对话框处理父母的Windows消息? – Ankit

+0

@Ankit我不明白你的意见。如果您执行'DispatcherPriority.ApplicationIdle',则所有待处理的“窗口消息”将在MessageBox.Show()'之前由当前窗口处理。 –

+0

@HighCode我的意思是,如果任何情况下,我收到消息发布在我的父对话框后显示消息框,然后那些被重定向到消息框。无论如何,你的解决方案现在适合我。我接受它作为答案。谢谢 – Ankit