0
如何刪除WPF中控件的構建事件中的所有關聯?如何刪除WPF中控件的構建事件中的所有關聯?
如何刪除WPF中控件的構建事件中的所有關聯?如何刪除WPF中控件的構建事件中的所有關聯?
沒有簡單的方法可以刪除在Dispatcher
上排隊的所有事件。即使有,你也不想這樣做,因爲它會破壞許多依賴於後臺事件來更新其數據結構和UI的WPF控件。
然而,存在是一種簡單的方法,以丟棄從隊列中選擇的輸入事件,如鍵盤,鼠標和指示筆事件:
創建與註冊事件處理程序爲「FlushInputQueue」方法InputManager.PreprocessInput
,以輸入優先級調用DispatcherOperation
,然後刪除事件處理程序。
當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保持響應?很多時候,這是比單擊項目時鎖定用戶界面更好的解決方案,並刪除了任何想要刷新隊列的原因。
你爲什麼要這麼做?你能給我們一個場景嗎? –
我有一個選項卡控件,裏面有許多複選框是他們的。如果我點擊一個複選框,那麼操作需要很長時間,所以在那個時候,如果我點擊任何其他複選框,第一個操作完成後,另一個點擊被引發。發生這種情況的原因是事件在Dispatcher中排隊等待。所以,如果我在開始操作時刪除事件處理程序,並在完成後再次添加事件處理程序。可能是我的問題將得到解決。 – Khan