2011-05-16 101 views
2

我遇到一個問題,點擊某個按鈕並且過程需要一段時間後,用戶在GUI屏幕上單擊其他位置。這些按鈕點擊會在調度程序中排隊,因此在初始按鈕點擊後,其他位置會被點擊。我想阻止這種情況發生,所以其他UI控件在完成處理後不會被點擊。我能想到的唯一解決方案就是鎖定鼠標事件並防止它們在按鈕點擊正在處理時傳遞給應用程序。這是最好的方法嗎?禁用鼠標點擊

回答

2

如果該過程需要一段時間,通常建議在工作線程而不是GUI線程中執行此類過程。因此,使用BackgroundWorker辦法想在這個CodeProject article,然後使用具有特定的按鈕關聯的命令CanExecute方法,就像這裏:

WPF Commanding – When do Commands re-evaluate their CanExecute method?
WPF – CanExecute refreshed

編輯:

可以綁定的IsEnabled財產您的其他控件爲Command的CanExecute方法的結果。

How to disable combobox when command canExecute returns false
How to bind a ComboBoxItem's IsEnabled property to the result of a Command's CanExecute method

+0

這些是如何在單擊後禁用單個按鈕的很好的示例,但是它不會阻止在處理按鈕命令執行處理程序時單擊其他按鈕或UI組件(如組合框)。 – Robert 2011-05-16 16:20:15

+0

@Robert:編輯我的答案。 – Paya 2011-05-16 16:33:06

2

解決這個問題的一個更簡單的方法是在某些長時間運行的任務正在進行時彈出一些半透明覆蓋圖(可能包含進度信息)。這將可靠地禁用整個用戶界面,直到您刪除覆蓋(這使您不必執行大量更改/綁定IsEnabled屬性)。

+0

這不會工作,因爲按鈕點擊在調度員仍在排隊,當我點擊該窗口上。因此,當點擊完成後,我忽略了窗口,排隊的點擊開始啓動。 – Robert 2011-05-16 16:18:18

+0

這對我來說聽起來像是你沒有在後臺線程上運行長時間運行的任務。這應該是你改變的第一件事。一旦你這樣做了,我建議在運行時禁用所有的控件(鼠標點擊不會排隊,它們會被覆蓋層處理,實質上只是丟棄它們)。最初,我並沒有意識到你沒有在後臺線程上運行這個進程。 – Tim 2011-05-16 16:20:43