【发布时间】:2011-11-04 11:31:13
【问题描述】:
我不知道如何解释它.. 所以我决定给出可以清楚场景的图像。 我想更新我的用户控件中的标签以从主应用程序启动的其他线程获取更新。我学习了依赖对象对这种单例模式的帮助很大,但困惑如何完成它花了将近一周的时间:(。
有时会出现 STA 线程问题,有时会发生从其他线程调用错误。
【问题讨论】:
标签: .net wpf multithreading .net-4.0
我不知道如何解释它.. 所以我决定给出可以清楚场景的图像。 我想更新我的用户控件中的标签以从主应用程序启动的其他线程获取更新。我学习了依赖对象对这种单例模式的帮助很大,但困惑如何完成它花了将近一周的时间:(。
有时会出现 STA 线程问题,有时会发生从其他线程调用错误。
【问题讨论】:
标签: .net wpf multithreading .net-4.0
您应该在其中实现INotiifyPropertyChanged 并从属性Instance 的设置器中引发PropertyChanged 事件,而不是让静态类TaskProgress 继承自DependencyObject。
这有两个原因...
DependencyObject 与线程无关,因此通过其他线程访问它肯定会导致错误。
INotifyPropertyChanged.PropertyChanged 事件由 WPF 的绑定框架在内部委托给 UI 调度程序。因此,一个简单的myTaskProgress.Instance = value 将自动更新 UI,无论它是从哪个线程完成的。
注意INotifyPropertyChanged是一个接口,它不能在静态类上实现,不能有静态事件或静态属性。您必须将TaskProgress 的一些实例(如上面的myTaskProgress)绑定到Label。
如果这有帮助,请告诉我。
【讨论】:
在线程上,
您可以尝试使用此代码:
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)(() =>
{
// your code to update UI here.
}
));
【讨论】:
我认为正确的代码应该是:
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));
【讨论】: