2011-11-04 103 views
0

我不知道如何解釋它..所以我決定給圖像,這將清除場景。 我想更新我的UserControl中的標籤以獲取從主應用程序啓動的其他線程的更新。我學的依賴對象幫助這個Singleton模式很多,但困惑如何把它做花費都在一週:(。任何應用程序級別的線程更新進度WPF

一段時間STA線程問題來得有些時間從其他線程調用錯誤發生。

enter image description here

回答

1

而不是使一個靜態類TaskProgressDependencyObject繼承的,應實現它INotiifyPropertyChanged和從屬性Instance的二傳手提高PropertyChanged事件。

這將做的原因有兩個訣竅...

  1. DependencyObject是線程無關,因此通過一些其他的線程,必然導致錯誤的訪問。

  2. INotifyPropertyChanged.PropertyChanged事件由WPF的綁定框架內部委託給UI調度程序。所以簡單的myTaskProgress.Instance = value會自動更新用戶界面,不管它是從哪個線程完成的。

請注意,INotifyPropertyChanged是一個接口,它不能在靜態類上實現,並且不能具有靜態事件或靜態屬性。您將需要將TaskProgress(如上面的myTaskProgress)的某個實例綁定到Label

讓我知道這是否有幫助。

1

在線程,

您可以嘗試使用此代碼:

this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)(() => 
{ 
    // your code to update UI here. 
} 
)); 
+0

在哪裏可以使用此代碼?以及如何綁定內容標籤..我想我也綁定了錯誤 –

+0

如果你很快,你可以從scrapAll函數更新標籤。第一時間不使用TaskProgress。 – Tony

0

我認爲正確的代碼應該是:

public string lblProgressBarProducts 
    { 
     get { return (string)GetValue(lblProgressBarProductsProperty); } 
     set { SetValue(lblProgressBarProductsProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for lblProgressBarProducts. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty lblProgressBarProductsProperty = 
     DependencyProperty.Register("lblProgressBarProducts", typeof(string), typeof(TaskProgress), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 
相關問題