Так что я не мог точно выяснить, почему у меня возникла эта проблема. Я попытался установить фокус на окне, кнопке и т. Д. Я пробовал несколько способов сообщить представлению, что модель представления обновлена. В основном каждое предложение, которое я мог найти в сети, не работало. Это почти похоже на ошибку.
Разумный член моей команды предложил щелкнуть мышью по окну. Его идея заключалась в том, что, поскольку для активации кнопки достаточно простого щелчка мышью по экрану, подделка должна иметь тот же эффект. Я думал (и думаю), что этот взлом был нелепым. Я попробовал это, просто чтобы посмотреть, смогу ли я назвать это «решением».
Ну, это сработало. У нас была такая же проблема в другом мастере (не AvalonWizard, а доморощенный). Я думаю, что должна быть некоторая основная проблема с тем, как окно перерисовывается после того, как фоновый поток обновляет объекты, связанные с пользовательским интерфейсом.
Во всяком случае, я нашел способ решить эту проблему с помощью следующего взломанного кода.
//import user32.dll and setup the use of the mouse_event method
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
/// <summary>
/// Watches for properties to change on the data object, mainly the ProvisioningComplete method
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void DataObject_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "ProvisioningComplete":
//if the provisioning is completed then we need to make the finish button selectable.
if (this.DataObject.ProvisioningComplete)
{
System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
{
//give the window focus
this.Focus();
//update the layout
WizardPageProvisioningClient.UpdateLayout();
//fake mouse click 50 pixels into the window
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, (uint)(this.Left + 50), (uint)(this.Top + 50), 0, 0);
}));
}
break;
}
}
Я проверял это, когда окно не является активным окном и когда пользователь покидает окно как выбранное. Метод фокусировки, кажется, решает эту проблему, когда окно не активно. Наша команда QA еще не провела полный тест на пользовательский интерфейс, поэтому я не могу сказать, есть ли ситуации, когда он не работает, но, похоже, это лучшее решение, которое я придумал на сегодняшний день.
Я открыт для любых других предложений, если у кого-то есть лучшее представление о том, что может быть причиной того, что кнопка не обновляется.