У меня проблема с моим BackgroundWorker
, помещенным в UserControl
.
Мое приложение WPF имеет навигацию слева, и каждая запись загружает свой собственный UserControl
, где пользователь может создать файл PDF.
Поскольку создание PDF занимает некоторое время, я реализовал BackgroundWorker
, который выполняет эту работу, и дополнительно я отключаю некоторые кнопки и показываю индикатор выполнения.
В событии RunWorkerCompleted
я сбрасываю состояние кнопок и скрываю индикатор выполнения.
Все это работает очень хорошо, несмотря на один сценарий:
Во время создания PDF-файла пользователь может переключаться между пользовательскими элементами управления и, если он возвращается к элементу управления, с которого он начал задание, элемент управления должен отображать индикатор выполнения и кнопки как отключенные.
Чтобы достичь этого, я добавил переменную (isProcessing) в UserControl
.
А конструктор управления у меня такой:
// Check if a current process is running, if so: handle button/progressbar visibility
if (_isProcessing)
{
_stkProgressBar.Visibility = Visibility.Visible;
progressBar1.IsIndeterminate = true;
// Disabling the buttons here is just working with a hack in
// the "Button_IsEnabledChanged" event.
btnDaten.IsEnabled = false;
btnBericht.IsEnabled = false;
this.Cursor = Cursors.Wait;
}
else
{
_stkProgressBar.Visibility = Visibility.Hidden;
}
Включение / отключение кнопок там просто работает из-за этого грязного хака:
private void btnDaten_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
//HACK: We want to disable the report buttons if a report execution is running.
// Disabling the buttons in the Load Event of the control isn't working
if (_isProcessing && (bool)e.NewValue)
{
btnDaten.IsEnabled = false;
btnBericht.IsEnabled = false;
}
}
Теперь, если задание выполняется и пользователь переключается между элементами управления, состояние элемента управления обработки в порядке. Но если задание завершено и PDF готов, кнопки не могут быть включены, а индикатор выполнения также остается видимым. Код помещается в событие RunWorkerCompleted
:
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// This is not working if the user switches between the controls
_isProcessing = false;
this.Cursor = Cursors.Arrow;
_stkProgressBar.Visibility = Visibility.Hidden;
btnDaten.IsEnabled = true;
btnBericht.IsEnabled = true;
}
Я отладил его и увидел, что кнопки получают правильный ввод и, следовательно, должны быть включены, но ничего не происходит. Если пользователь остается в элементе управления, где он начал задание, состояние кнопок и индикатор выполнения сбрасываются правильно.