当我使用WinForms时,我会用bg_DoWork
方法完成此操作:
status.Invoke(new Action(() => { status.Content = e.ToString(); }));
status.Invoke(new Action(() => { status.Refresh(); }));
但是在我的WPF应用程序中,我收到一条错误消息,指出Invoke
不存在Label
。
任何帮助都将不胜感激。
答案 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代码。