更新任何应用程序级别WPF中的线程进度

时间:2011-11-04 11:31:14

标签: .net wpf multithreading .net-4.0

我不知道如何解释它。所以我决定给出清晰情景的图像。 我想在我的Usercontrol中更新标签以从主应用程序启动的其他线程获取更新。我学习依赖对象帮助这个单例模式很多,但是混淆了如何完成它几乎花了一周:(。

有些时候STA线程问题出现了一段时间从其他线程调用发生错误。

enter image description here

3 个答案:

答案 0 :(得分:1)

在帖子上,

您可以尝试使用此代码:

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

答案 1 :(得分:1)

不要让静态类TaskProgress继承自DependencyObject,而应在其中实现INotiifyPropertyChanged,并从属性{{1}的setter中引发PropertyChanged事件}。

这可以解决问题,原因有两个......

  1. Instance与线程无关,因此通过其他线程访问它肯定会导致错误。

  2. DependencyObject事件由WPF的Binding框架内部委托给UI调度程序。所以一个简单的INotifyPropertyChanged.PropertyChanged将自动更新UI,无论它是从哪个线程完成的。

  3. 请注意myTaskProgress.Instance = value是一个接口,它不能在静态类上实现,也不能有静态事件或静态属性。您将有INotifyPropertyChanged的某个实例(如上面的TaskProgress)绑定到myTaskProgress

    如果有帮助,请告诉我。

答案 2 :(得分: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));