我目前正在实现 MessageDialog 控件。它在那里可以完全替换MessageBox
,并显示为“窗口内弹出窗口”(需要正确的UX术语)。
当前,其构造函数是私有(private)的,并且有一个Show
方法,就像MessageBox.Show
中一样。但是,MessageBox
阻止UI线程并返回结果。
我的MessageDialog
控件当前所做的是具有Action<MessageDialogResult> callback
参数,该参数在单击按钮时被调用。
使用MessageDialog
// class MessageDialog
public static void MessageDialog.Confirmation(Window owner, string message, Action<MessageDialogResult> callback);
// When used by other controls
MessageDialog.Confirmation(WindowMain.Singleton, true, (result) =>
{
if (result.Button == MessageDialogButton.Yes)
{
//...
}
});
但是,像
MessageBox.Show
中那样使用回调而不是阻塞方法调用对我绝对没有任何好处。这使事情变得相当复杂。我想实现的目标是...if (MessageDialog.Confirmation(WindowMain.Singleton, true).Button == MessageDialogButton.Yes)
{
//...
}
...我认为这更干净。
后面的当前代码基本上是
MessageDialog
实例,并使用文本Window.Content.Children
的子项callback(result)
并从Window.Content.Children
中删除问题:我想要实现的是使用阻塞方法调用,而不是触发回调的方法。
最佳答案
这样的事情怎么样:
//DialogControl.cs
bool _closed = false;
DialogResult _result;
DialogResult ShowModal()
{
this.Show();
while(!_closed) Application.DoEvents(); //Infinite loop
return _result;
}
public void OkButton_OnClick(EventArgs e, object sender)
{
_result = DialogResult.OK;
_closed = true;
}
public void CancelButton_OnClick(EventArgs e, object sender)
{
_result = DialogResult.Cancel;
_closed = true;
}
关于c# - 视窗内弹出式视窗: How to block UI thread?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41274385/