Я пытаюсь повторно использовать UserControl, а также позаимствовать некоторую логику, которая отслеживает прогресс. Я постараюсь упростить вещи. MyWindow.xaml включает MyUserControl. MyUserControl имеет собственный индикатор выполнения (выполняется форматирование..., копирование файлов... и т. д.), и я хотел бы отразить этот прогресс где-нибудь в форме MyWindow. Но у пользовательского элемента управления есть некоторая логика, которую я не совсем понимаю. Я читал и читал, но я все еще не понимаю Dispatcher. Вот сводка логики в пользовательском элементе управления, который обновляет ход выполнения.
this.Dispatcher.Invoke(DispatcherPriority.Input, (Action)(() =>
{
DAProgressIndicator = InfiniteProgress.AddNewInstanceToControl(StatusGrid, new SolidColorBrush(new Color() { A = 170, R = 128, G = 128, B = 128 }), string.Empty);
DAProgressIndicator.Message = MediaCardAdminRes.ActivatingCard;
ActivateInProgress = true;
}));
Я подумал, что буду умнее и добавлю событие в MyUserControl, которое будет вызываться в логике набора свойств ActivateInProgress.
public bool ActivateInProgress
{
get
{
return _activateInProgress;
}
set
{
_activateInProgress = value;
if (ActivateInProgressHandler != null)
{
ActivateInProgressHandler(value);
}
}
}
Я устанавливаю ActivateInProgressHandler в конструкторе MyWindow для следующего метода, который устанавливает свойство модели представления, используемое для собственного индикатора хода выполнения окна.
private void SetActivation(bool activateInProgress)
{
viewModel.ActivationInProgress = activateInProgress;
}
Однако индикатор хода выполнения окна никогда не меняется. Итак, я убежден, что Dispatcher.Invoke делает что-то, чего я не понимаю. Если я помещу окно сообщения в метод SetActivation, поток заблокируется, а индикатор выполнения окна обновится. Я понимаю основные потоки, но вся эта штука с Dispatcher для меня в новинку. Что мне не хватает?
ОБНОВЛЕНИЕ: Кажется, теперь это работает. Оказывается, прогресс обновлялся так быстро, что никогда не отображался на экране. Но я все же хотел бы понять, почему был сделан Dispatcher.Invoke (это был существующий код, который я не писал). Почему содержимое действия не соответствует остальной части кода *.xaml.cs?