我有一个带有文本框和按钮的简单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对话框和非模态对话框会有帮助。
答案 0 :(得分:0)
您可以使用DispatcherPriority
方法的BeginInvoke()
参数为Dispatcher操作设置所需的优先级。我通常使用的最低优先级是ApplicationIdle
,因此允许Dispatcher在处理您的所有挂起操作之前完成处理。
Dispatcher.BeginInvoke(new Action(() =>
{
MessageBox.Show("Lost focus");
}), DispatcherPriority.ApplicationIdle);