2011-10-12 79 views
0

我正在使用Windows Phone上的應用程序,並使用silverlight。 我有一些錯誤,用戶可以快速按下按鈕兩次,這將有效地執行2個WCF調用,因爲該操作被調用2次。如何在WCF異步調用運行時阻止輸入?

顯而易見的解決方案只是禁用按鈕,直到調用完成,但我想知道是否有一個更全面的解決方案,我不必爲每個操作實現這一點。我的應用程序使用了大約50個WCF方法,因此對於每一個單獨的動作/每個屏幕都實現這個過程會很繁瑣。

還有,用戶可以調用運行時,點擊手機返回鍵,開始點擊其他按鈕等情況......

任何人都知道這一個乾淨的解決方案?

回答

0

簡單的解決方案:使用一個布爾變量,它將在第一次點擊後設置爲true,當服務器返回結果時設置爲false。在點擊處理程序中,只需檢查此變量的值,如果爲真,則不要再次調用該服務。

0

您是否在應用程序中使用了像MVVM這樣的設計模式?如果沒有,你可能應該。 在這種情況下,您可以創建一個名爲IsIdle的布爾屬性或類似的東西。然後只需設置<Button IsEnabled="{Binding IsIdle}"。 現在,只要您開始進行異步調用,請將IsIdle設置爲false。這將禁用按鈕。加載完成後,將其設置回true,以便再次啓用所有按鈕。

0

這可能不是很優雅,但我認爲它會阻止任何輸入,而不會蔓延到您的視圖和代碼。

您可以通過IsHitTestable = true臨時覆蓋屏幕上的透明矩形來防止輸入。您可以編寫一個小型實用程序方法,將任何屏幕上的該矩形推上去,並在想要恢復輸入時將其移除。

當網絡很慢時,您也可以使用該屏幕最終顯示類似繁忙指示符的內容。

+0

事實上,如果你只是想阻止某些操作,這是行不通的。更好的解決方案可能是擁有一個靜態屬性IsNetworkBlocked,並將其綁定到僅啓動網絡調用的控件的IsHitTestable或IsEnabled。 –

+0

實際上,這是我一起去的。事實證明,它對我所需要的很好。由於我使用mvvm並且所有ViewModel都從基礎模型繼承,所以實現起來很簡單。所以我簡單地在基礎模型中添加了一個名爲「IsBusy」的屬性,並對該屬性的矩形可見性進行了數據分析。除此之外,我還能夠在該矩形中放置一個細微的「工作」動畫,當我的應用程序與服務器進行通信時,給予了非常專業的感覺。謝謝安東尼! – Alexandre