如何从BackgroundWorker线程中更新标签?

时间:2015-05-22 13:29:18

标签: c# wpf xaml backgroundworker

当我使用WinForms时,我会用bg_DoWork方法完成此操作:

status.Invoke(new Action(() => { status.Content = e.ToString(); }));
status.Invoke(new Action(() => { status.Refresh(); }));

但是在我的WPF应用程序中,我收到一条错误消息,指出Invoke不存在Label

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:7)

使用BackgroundWorker中已内置的功能。当您“报告进度”时,它会将您的数据发送到在{i}}事件上运行,该事件在UI线程上运行。无需致电ProgressChanged

Invoke()

确保您设置private void bgWorker_DoWork(object sender, DoWorkEventArgs e) { bgWorker.ReportProgress(0, "Some message to display."); } private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { status.Content = e.UserState.ToString(); } 以启用报告进度。

答案 1 :(得分:2)

如果您正在使用WPF,我建议您查看DataBinding。

" WPF方式"接近这一点就是将标签的Content属性绑定到模型的某个属性。这样,更新模型会自动更新标签,您不必担心自己编组线程。

有很多关于WPF和数据绑定的文章,这可能是一个很好的起点:http://www.wpf-tutorial.com/data-binding/hello-bound-world/

答案 2 :(得分:1)

您需要使用

Dispatcher.Invoke(new Action(() => { status.Content = e.ToString(); }))

而不是status.Invoke(...)

答案 3 :(得分:1)

这会对你有帮助。

同步执行:

Application.Current.Dispatcher.Invoke(new Action(() => { status.Content = e.ToString(); }))

异步执行:

Application.Current.Dispatcher.BeginInvoke(new Action(() => { status.Content = e.ToString(); }))

答案 4 :(得分:1)

你真的应该考虑使用" Data Binding"在WPF中。

您应该更新视图模型中的对象并将其绑定到用户界面控件。

参见MVVM Light。简单易用。没有它就不要编写WPF代码。