我不知道如何解释它。所以我决定给出清晰情景的图像。 我想在我的Usercontrol中更新标签以从主应用程序启动的其他线程获取更新。我学习依赖对象帮助这个单例模式很多,但是混淆了如何完成它几乎花了一周:(。
有些时候STA线程问题出现了一段时间从其他线程调用发生错误。
答案 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
事件}。
这可以解决问题,原因有两个......
Instance
与线程无关,因此通过其他线程访问它肯定会导致错误。
DependencyObject
事件由WPF的Binding框架内部委托给UI调度程序。所以一个简单的INotifyPropertyChanged.PropertyChanged
将自动更新UI,无论它是从哪个线程完成的。
请注意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));