【发布时间】:2016-12-22 01:10:35
【问题描述】:
我目前正在实施 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中删除
问题:我想要实现的是调用阻塞方法而不是触发回调。
【问题讨论】:
-
那你的问题是什么?
-
截图后见代码块。问题是如何创建线程阻塞对话框而不是触发回调的对话框。
-
为什么需要阻塞UI线程?如果您将其作为窗口内对话框执行,那么您可以只使用一个覆盖整个屏幕并在其顶部显示对话框的
Rectangle,使对话框成为唯一可交互的控件。 -
交互没有问题。只是控件的使用很难阅读和维护。我宁愿阻止线程并将结果作为值返回,而不是传递回调。这样代码看起来就和
MessageBox.Show一样干净。 -
您不能在不阻塞线程的情况下暂停代码,当对话框存在于同一个线程上时,您确实不想这样做。在这种情况下,您仅有的两个选择是使用回调或多线程整个过程。在这两个选项中,我强烈推荐回调选项作为更简单的选择。
标签: c# .net wpf mvvm mvvm-light