簡體   English   中英

使用棱鏡創建基礎荷載視圖

[英]Creating base loading view with prism

我的棱鏡應用程序有很多從我的視圖模型調用的異步操作。 在某些情況下,我希望視圖被禁用並顯示某種繁忙的指示符,直到視圖模型從異步操作獲取結果為止。

我雖然創建了將實現此行為的基本視圖(即具有IsLoading的依賴項屬性,該屬性將禁用該視圖並在其上方顯示一個繁忙指示器)。 問題是,我不確定如何實現此基本視圖。 任何幫助,將不勝感激,謝謝。

編輯:我想我寫了一個工作的LoadingView。

public class LoadingView : UserControl { private object content;

  public bool IsLoading { get { return (bool)GetValue(IsLoadingProperty); } set { SetValue(IsLoadingProperty, value); } } private ProgressRing m_RingControl; public LoadingView() { m_RingControl = new ProgressRing(); m_RingControl.IsActive = false; } // Using a DependencyProperty as the backing store for IsLoading. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsLoadingProperty = DependencyProperty.Register("IsLoading", typeof(bool), typeof(LoadingView), new PropertyMetadata(false, IsActivePropertyChanged)); private static void IsActivePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { LoadingView view = d as LoadingView; if (view != null) { // Loading - show ring control if (((bool)e.NewValue) == true) { view.content = view.Content; view.Content = view.m_RingControl; view.m_RingControl.IsActive = true; } else { view.m_RingControl.IsActive = false; view.Content = view.content; } } } } 

我在視圖模型中將綁定與一些IsLoading(或IsBusy)放在LoadingView.IsLoading上

這是一個可能很快變得非常復雜的主題。

我建議在方法上進行一些小的更改-而不是將IsBusy屬性放在基礎視圖模型中,而應使其抽象化,以便每個派生的視圖模型必須實現自己的特定檢查。

public class BaseViewModel : INotifyPropertyChanged
{

    public abstract bool IsBusy { get; }

}

public class FancyViewModel : BaseViewModel
{

    public override bool IsBusy
    {
        get { return [check #1] && [check #2]...; }
    }
}

現在由每個特定的視圖模型確定是否繁忙。 粗略的機制是擁有一個計數器,您可以在每次啟動異步功能時就增加一個計數器,並在操作結束時將其遞減-如果其值等於零,則說明當前沒有異步操作。 當使用標志或計數器時,請注意由於編譯器的優化而可能發生的各種屬性讀取問題,請學習在正確的位置使用volatile關鍵字。

另外,也可以使用線程安全的CountdownEvent類來代替保持計數器。 如果您想真正變得更高級,則可以在System.Threading名稱空間中查看各種線程信令機制,或者查看任務並行性Task對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM