Я пишу приложение (c # + wpf), в котором все диалоги модального стиля реализованы в виде UserControl
поверх полупрозрачной сетки, покрывающей основную Window
. Это означает, что есть только один Window
, и он поддерживает внешний вид всех приложений фирм.
Чтобы отобразить MessageBox
, синтаксис следующий:
CustomMessageBox b = new CustomMessageBox("hello world");
c.DialogClosed += ()=>
{
// the rest of the function
}
// this raises an event listened for by the main window view model,
// displaying the message box and greying out the rest of the program.
base.ShowMessageBox(b);
Как видите, не только поток выполнения фактически инвертирован, но и ужасно многословен по сравнению с классической версией .NET:
MessageBox.Show("hello world");
// the rest of the function
Что я действительно ищу, так это способ не возвращаться из base.ShowMessageBox
до тех пор, пока оно не вызовет событие закрытия диалога, но я не могу понять, как можно ожидать этого, не вешая поток GUI и, таким образом, пользователь когда-либо нажимал ОК. Я знаю, что могу взять функцию делегата в качестве параметра функции ShowMessageBox
, которая предотвращает инверсию выполнения, но все же вызывает некоторый сумасшедший синтаксис / отступ.
Я что-то упускаю из виду или есть стандартный способ сделать это?