这个话题有很多答案,从创建自定义类到使用第三方库都有。如果你想要带有漂亮视觉效果的酷炫弹出窗口,我建议使用第三方库。
但是,如果你只想在WPF应用程序中使用微软的常规消息框,这里是一个MVVM/单元测试友好的实现:
最初,我想从消息框中继承并使用接口进行包装,但由于消息框没有公共构造函数,所以我无法这样做,因此这里提供了一个“简单”的解决方案:
在Visual Studio中反编译消息框,你可以看到所有的方法重载,我检查了我想要的方法,然后创建了一个新类并添加了这些方法,并使用接口进行包装,完成!现在你可以使用Ninject来绑定接口和类,注入它并使用Moq进行单元测试等。
创建一个接口(只添加了一些重载方法,因为我不需要它们全部):
public interface IMessageBox
{
MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button);
MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon);
MessageBoxResult Show(string messageBoxText, string caption);
}
然后我们有一个将继承它的类:
public class MessageBoxHelper : IMessageBox
{
public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button,
MessageBoxImage icon)
{
return MessageBox.Show(messageBoxText, caption, button, icon, MessageBoxResult.None,
MessageBoxOptions.None);
}
public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button)
{
return MessageBox.Show(messageBoxText, caption, button, MessageBoxImage.None, MessageBoxResult.None,
MessageBoxOptions.None);
}
public MessageBoxResult Show(string messageBoxText, string caption)
{
return MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None,
MessageBoxResult.None, MessageBoxOptions.None);
}
public MessageBoxResult Show(string messageBoxText)
{
return MessageBox.Show(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None,
MessageBoxResult.None, MessageBoxOptions.None);
}
}
现在只需在注入等操作时使用此方法,然后您就拥有了一个脆弱的抽象,可以完成任务...这取决于您将在何处使用它。我的情况是一个简单的应用程序,只需要做一些事情,因此没有必要过度工程化解决方案。希望这能帮助到某些人。