2010-03-17 28 views
4

我們有一個WPF應用程序(實際上是一個VSTO WPF應用程序)。在某些控件上有多個元素,點擊後可從Web服務加載數據並更新UI。現在,我們同步執行這些Web請求,阻塞UI線程,直到響應返回。這可以防止用戶在數據加載時單擊應用程序,可能會將其置於無效狀態以在返回數據時處理數據。如何在WPF異步操作期間阻止UI

當然,如果請求需要很長時間,應用程序將變得無響應。理想情況下,我們希望在此期間取消按鈕處於活動狀態,但沒有別的。有沒有一種聰明的方式來做到這一點,或者我們是否必須使用backgroundworker將請求切換爲異步執行,並寫入一些內容,以便在請求正在進行時禁用除取消按鈕外的所有控件?

編輯:對於我們已經期望長時間運行的操作(下載文件等),我們彈出一個進度對話窗口。例如,當你期望這個動作非常快(最多幾秒鐘),但偶爾需要更長的時間。在這種情況下,閃爍整個窗口片刻太過分了。

回答

4

您的可單擊控件應該綁定到命令,並且在後臺任務正在進行時命令應該有CanBeExecuted返回false。如果這樣做,綁定到這些命令的控件將自動禁用並啓用它們自己。

通過創建一個實現後臺任務進行中檢查的命令類,然後從該類中導出所有命令(當然除了cancel命令),可以避免重複大量代碼。

1

當你在一個單獨的線程上進行異步請求時,顯示一個帶取消按鈕的模態對話框(也可能是一個進度條或其他活動指示器)。

這樣用戶就不能與底層的UI進行交互,他們仍然會收到有關正在發生的事情的反饋信息......以及取消它的能力。

+0

SRY我應該澄清我的問題,請參見編輯 – mcintyre321 2010-03-17 13:30:23

0

除了「取消」以外,我無法想到除禁用所有控件之外的簡單方法。

話雖如此,如果您僅用取消按鈕顯示「工作」或進度對話框,它可能會給用戶更好的體驗。

您可以使用此dailog顯示有關Web請求進度和可能返回的錯誤消息的有用信息。

1

一種方法是在等待響應時無法訪問的部分UI上放置半透明畫布,並在中間放置帶取消按鈕的消息。

+0

取消請求啓動按鈕前已經是可見的,但我想我們可以給它更高的z-index – mcintyre321 2010-03-17 13:29:50

+0

是可能的有多個按鈕綁定到相同的命令。 – 2010-03-17 13:58:08

+0

當然 - 我只是想着如何做到這一點,而不用創建兩個相同的取消按鈕,一個坐在另一個之上 – mcintyre321 2010-03-17 14:10:35

1

Silverlight Toolkit有一個BusyIndi​​cator控件。該工具包是開源的,因此您可以輕鬆將其移植到WPF。

它禁用和灰色分配給它的區域中的所有內容,將它的IsBusy屬性設置爲true或者通過代碼或將其綁定到模型。用法如下:

​​