Modal Dialogs的WPF表单和Windows消息传递

时间:2012-12-07 11:16:02

标签: .net wpf winforms window-messages message-loop

我有一个带有文本框和按钮的简单WPF表单,在失去焦点时,它只是简单地显示一个消息框。 我的代码看起来像这样

   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格式)和队列中的任何UI待处理消息似乎都是由消息框处理的(我怀疑)所以对于例如如果我单击画布控件理想情况下我会“鼠标按下”和“鼠标向上”,但如果在此之间有模态消息框然后我只得到“鼠标按下”并且“鼠标向上”消息丢失。

注意:我不认为在非模态对话框中看不到此行为。

另外,据我所知,如果有人可以向我发表关于Windows窗体如何处理Windows消息泵的好文章,以及Modal对话框和非模态对话框会有帮助。

1 个答案:

答案 0 :(得分:0)

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

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