我目前正在实施 MessageDialog 控件。它完全替换MessageBox
并显示为"窗口内弹出窗口" (需要正确的UX术语)。
目前,它的构造函数是私有的,并且有一个方法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
问题:我想要实现的是阻塞方法调用,而不是触发回调的方法。
答案 0 :(得分:3)
尽管接受的答案似乎有效,但我建议使用TaskCompletionSource
提供更好的解决方案。这正是await
的用途 - 它基本上只是一个回调(不会阻塞线程),但是使用它时你的代码看起来要简单得多。
TaskCompletionSource<DialogResult> taskSource;
Task<DialogResult> ShowAsync()
{
return taskSource.Task;
}
public void OkButton_OnClick(EventArgs e, object sender)
{
taskSource.SetResult(DialogResult.OK);
}
public void CancelButton_OnClick(EventArgs e, object sender)
{
taskSource.SetResult(DialogResult.Cancel);
}
然后你必须等待电话:await Dialog.ShowAsync()
答案 1 :(得分:1)
这样的事情怎么样:
mean/variance/scale/shift