MessageBox.Show, не блокирующий поток
Я занимаюсь обслуживанием веб-сайта на основе Silverlight с использованием шаблона MVVM и построенного на платформе CSLA для его бизнес-логики. Недавно возникла странная проблема, когда я должен нажать несколько раз, чтобы сохранить, прежде чем диалог сохранения появится на экране. После небольшого исследования я обнаружил, что диалог MessageBox OK / Cancel, который должен блокировать поток до тех пор, пока не будет нажата кнопка OK или Cancel, позволяет потоку проходить через него, вообще ничего не показывая на экране. Вот соответствующий метод в базовом классе модели представления:
private void SavingProcess(object sender, ExecuteEventArgs e)
{
IsSavedProcessCancelled = true;
MessageBoxResult result;
if (IgnoreSaveMessageBox)
result = MessageBoxResult.OK;
else
result = MessageBox.Show("Are you sure want to save the data?", "Data Changes", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
IsSavedProcessCancelled = false;
base.Save(sender, e);
}
}
IgnoreSaveMessageBox имеет значение false, и выполнение кода правильно передается оператору else. Когда я прохожу через него, он проходит через строку MessageBox.Show(), как и любой другой. Даже более странный, результат на самом деле имеет значение "None" впоследствии вместо того, чтобы быть нулевым, как я ожидал.
Я решил попробовать обернуть первый оператор if / else в цикле while, чтобы посмотреть, что произойдет (я понимаю, что это действительно ужасная вещь, и не принял бы ее как решение, даже если бы это сработало):
MessageBoxResult result = MessageBoxResult.None;
while (result != MessageBoxResult.OK)
{
if (IgnoreSaveMessageBox)
result = MessageBoxResult.OK;
else
result = MessageBox.Show("Are you sure want to save the data?", "Data Changes", MessageBoxButton.OKCancel);
}
Это в конечном итоге приведет к появлению диалога, но это займет восемь или девять итераций в цикле. Это также происходит только тогда, когда я пытаюсь сохранить определенную сетку, полную элементов списка, и список должен быть более 30 элементов; меньшие списки не имеют этой проблемы.
Я обошел эту проблему, установив для IgnoreSaveMessageBox значение true при сохранении в этом конкретном экземпляре, но я надеюсь, что кто-то там сможет помочь мне исправить это должным образом. Спасибо за прочтение!