2015-05-22 2 views
1

Когда я использовал WinForms, я сделал бы это в моем bg_DoWork методе:Как обновить метку из потока BackgroundWorker?

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

Однако в моем WPF приложения, я получаю сообщение об ошибке о том, что Invoke не существует для Label.

Любая помощь будет оценена по достоинству.

ответ

1

Это поможет вам.

Для Execute синхронно:

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

Для Execute Асинхронный:

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

Вы должны использовать

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

вместо status.Invoke(...)

7

Используйте возможности уже встроены в BackgroundWorker. Когда вы «сообщаете о прогрессе», он отправляет ваши данные в событие 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(); 
} 

Убедитесь, что вы установили bgWorker.WorkerReportsProgress = true, чтобы включить отчетность.

+1

Это. Потому что вы действительно не хотите обновлять элементы пользовательского интерфейса для разных потоков. –

2

Если вы используете WPF, я предлагаю смотреть в DataBinding.

«Способ WPF», чтобы приблизиться к этому, заключается в привязке свойства метки Content к некоторому свойству вашей модели. Таким образом, обновление модели автоматически обновляет ярлык, и вам не придется беспокоиться о сортировке потоков самостоятельно.

Есть много статей о WPF и привязки данных, это, вероятно, столь же хорошее место, чтобы начать, как любой: http://www.wpf-tutorial.com/data-binding/hello-bound-world/

1

Вы действительно должны думать об использовании силы «Data Binding» в WPF.

Вы должны обновлять объект в своей модели просмотра и связывать его с вашим интерфейсом пользовательского интерфейса.

Посмотреть MVVM Light. Легко и просто использовать. Не кодируйте WPF без него.

+2

Вы не нуждаетесь в каких-либо причудливых рамках использования шаблона проектирования MVVM. Хотя это делает некоторые вещи немного легче управлять. –

+0

MVVM Light отлично. – Contango

Смежные вопросы