2012-12-07 115 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