2010-01-12 40 views
0

如何刪除WPF中控件的構建事件中的所有關聯?如何刪除WPF中控件的構建事件中的所有關聯?

+0

你爲什麼要這麼做?你能給我們一個場景嗎? –

+0

我有一個選項卡控件,裏面有許多複選框是他們的。如果我點擊一個複選框,那麼操作需要很長時間,所以在那個時候,如果我點擊任何其他複選框,第一個操作完成後,另一個點擊被引發。發生這種情況的原因是事件在Dispatcher中排隊等待。所以,如果我在開始操作時刪除事件處理程序,並在完成後再次添加事件處理程序。可能是我的問題將得到解決。 – Khan

回答

1

沒有簡單的方法可以刪除在Dispatcher上排隊的所有事件。即使有,你也不想這樣做,因爲它會破壞許多依賴於後臺事件來更新其數據結構和UI的WPF控件。

然而,存在一種簡單的方法,以丟棄從隊列中選擇的輸入事件,如鍵盤,鼠標和指示筆事件:

  1. 創建與註冊事件處理程序爲「FlushInputQueue」方法InputManager.PreprocessInput,以輸入優先級調用DispatcherOperation,然後刪除事件處理程序。

  2. PreprocessInput事件觸發時,檢查輸入消息並將Handled標誌設置爲true,如果您想放棄它。

下面是一些代碼,讓你開始:

public void FlushInputQueue() 
{ 
    PreProcessInputEvent handler = (obj, e) => 
    { 
    if(ShouldFlushEvent(e.StagingItem.Input)) 
     e.StagingItem.Input.Handled = true; 
    }; 
    InputManager.PreProcessInput += handler; 
    Dispatcher.Invoke(DispatcherPriority.Input, new Action(() => {})); 
    InputManager.PreProcessInput -= handler; 
} 

private bool ShouldFlushEvent(InputEventArgs e) 
{ 
    // Example only: 
    return e is MouseEventArgs || e is KeyboardEventArgs || e is StylusEventArgs; 
} 

的ShouldFlushEvent方法也許應該爲您定製特定的場景,以避免拋出應當保持事件。

最後一個想法:您是否考慮過在後臺線程上執行長時間運行操作,以便UI保持響應?很多時候,這是比單擊項目時鎖定用戶界面更好的解決方案,並刪除了任何想要刷新隊列的原因。

相關問題