Я уже искал форум, но никакие заданные соответствия вопроса к моей проблеме я думаю...
Я использую BackgroundWorker для обработки очень трудоемкой операции. После того, как эта операция заканчивается, кнопка должна быть установлена на включенный так, чтобы пользователь мог выполнить другую операцию.
Я использую WPF, и я следую за шаблоном MVVM, таким образом, у меня нет прямого доступа к этой кнопке. Я должен назвать метод в обработчике событий BackgroundWorker_RunWorkerCompleted, который устанавливает Свойство, представляя включенное состояние кнопок, к истинному.
Это все хорошо работает кроме одной вещи: кнопка только перерисовывается после того, как я, например, щелчок в окно (или максимизируют окно...). Это является очень раздражающим и взяло меня целый день для избавлений от этого поведения, но я не могу найти решение...
Обработчик событий BackgroundWorker_RunWorkerCompleted похож на это:
void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }
У кого-либо есть какая-либо идея, как устранить эту проблему?
Править:
Кнопка связывается с командой:
Этой командой является RelayCommand, как Smith заявил в своем блоге (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) и похож на это:
public RelayCommand LoadTargetCommand
{
get
{
if (loadTargetCommand == null)
{
loadTargetCommand = new RelayCommand(param => this.OnRequestLoadFile(BusinessLogic.CustomTypes.TreeType.Target), param => this.CanLoadTarget);
}
return loadTargetCommand;
}
set { loadTargetCommand = value; }
}
это. CanLoadTarget имеет значение true SetButtonToEnabled (); метод
Редактирование 2:
следующий код 'работы':
fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();
но это - своего рода действительно опасный и ужасный код...
-Полагая, что это не объясняет Вашу проблему, Вы можете попробовать добавить
System.Windows.Forms.Application.DoEvents();
или
Dispatcher.Invoke(new Action(delegate { }), DispatcherPriority.Background);
в конец вызова функции SetButtonToEnabled (после того, как Вы установите кнопку Enabled в true). Похоже, что фоновый рабочий вызывает событие Complete (Завершить), но графический интерфейс не обновляется.
Здесь приведен полный пример использования фонового редактора в WPF. Возможно, вы захотите взглянуть на него и убедиться, что все выглядит одинаково.
Вы также можете взглянуть на Асинхронная работа с объектом фонового рабочего стола . Это хороший пример использования диспетчера и фонового рабочего
Модель WPF Threading Model является еще одним отличным источником для проверки.
] Ваша проблема, вероятно, не имеет ничего общего с фоновым работником. Если вызвать метод []SetButtonToEnabled[
] непосредственно из основного потока, то, вероятно, вы увидите такое же поведение. Замените вызов метода []RunWorkerAsync[
] на вызов метода []SetButtonToEnabled[
] для проверки этого.[
] Пара комментаторов посоветовала вам взглянуть на вашу []INotifyPropertyChanged[
] реализацию, это звучит как хороший совет. [