Почему BackgroundWorker_RunWorkerCompleted не обновляет GUI?

Я уже искал форум, но никакие заданные соответствия вопроса к моей проблеме я думаю...

Я использую 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();

но это - своего рода действительно опасный и ужасный код...

5
задан lakai 6 January 2010 в 08:35
поделиться

2 ответа

-Полагая, что это не объясняет Вашу проблему, Вы можете попробовать добавить

System.Windows.Forms.Application.DoEvents();

или

Dispatcher.Invoke(new Action(delegate { }), DispatcherPriority.Background);

в конец вызова функции SetButtonToEnabled (после того, как Вы установите кнопку Enabled в true). Похоже, что фоновый рабочий вызывает событие Complete (Завершить), но графический интерфейс не обновляется.

Здесь приведен полный пример использования фонового редактора в WPF. Возможно, вы захотите взглянуть на него и убедиться, что все выглядит одинаково.

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

Модель WPF Threading Model является еще одним отличным источником для проверки.

2
ответ дан 15 December 2019 в 06:27
поделиться
[

] Ваша проблема, вероятно, не имеет ничего общего с фоновым работником. Если вызвать метод []SetButtonToEnabled[] непосредственно из основного потока, то, вероятно, вы увидите такое же поведение. Замените вызов метода []RunWorkerAsync[] на вызов метода []SetButtonToEnabled[] для проверки этого.[

]. [

] Пара комментаторов посоветовала вам взглянуть на вашу []INotifyPropertyChanged[] реализацию, это звучит как хороший совет. [

]
1
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: