WPF MVVM Stylet使用文档(中文) 07- MessageBox

简介

我们都知道,WPF有自己的消息框实现——“System.Windows.MessageBox”。这很好,除了你不能从你的 ViewModel中调用它(好吧,你可以,但它使你的 ViewModel 不可测试)。网上常见的解决办法是“实现你自己的消息框”。

好吧,Stylet 自带了自己的 MessageBox 克隆,它的外观和行为几乎与 WPF 的一样(包括外观、按钮、图标、自动调整大小、声音、对齐等)。

使用方法(Usage)

从 IWindowManager 调用 ShowMessageBox 即可,像这样:

C# VB.NET
public MyViewModel
{
private readonly IWindowManager windowManager;

public MyViewModel(IWindowManager windowManager)
{
this.windowManager = windowManager;
}

public void ShowMessagebox()
{
var result = this.windowManager.ShowMessageBox("Hello");
}
Public Class MyViewModel

Private ReadOnly windowManager As IWindowManager

Public Sub New(ByVal windowManager As IWindowManager)
Me.windowManager = windowManager
End Sub

Public Sub ShowMessagebox()
Dim result = Me.windowManager.ShowMessageBox("Hello")
End Sub

End Class

MessageBox接受与WPF消息框相同的所有选项,还有增加了一些其它选项。

定制消息框(Customising the MessageBox)

Stylet 的 MessageBox 实现为一个 ViewModel,MessageBoxViewModel,以及它相应的视图 MessageBoxView。ViewModel 实现了一个接口 IMessageBoxViewModel,而 ShowMessageBox() 方法使用这个接口来检索 ViewModel 的实例。

因此,您可以通过编写一个实现 IMessageBoxViewModel 的 ViewModel,并将其注册到 IoC 容器中,从而提供自己的 MessageBoxViewModelMessageBoxView 的自定义实现。然后 ShowMessageBox()将使用它。

如果你只是想调整现有的 MessageBoxViewModel 的行为,你可以有以下选择:

定制按钮文本(Custom Button Text)

通过修改 MessageBoxViewModel.ButtonLabels,您可以在每个应用程序的基础上编辑任何按钮的按钮文本。它是一个字典,保存每个按钮要显示的文本。如果你只是想编辑文本的一个特定的消息框,ShowMessageBox 将接受一个字典,你可以这样做:

C# VB.NET
MessageBoxViewModel.ButtonLabels[MessageBoxResult.No] = "No, thanks";

this.windowManager.ShowMessageBox("Do you want breakfast?",
buttons: MessageBoxButton.YesNo,
buttonLabels: new Dictionary<MessageBoxResult, string>()
{
{ MessageBoxResult.Yes, "Yes please!" },
});

// Will display a MessageBox with the buttons "Yes please!" and "No, thanks"
MessageBoxViewModel.ButtonLabels(MessageBoxResult.No) = "No, thanks"
Me.windowManager.ShowMessageBox("Do you want breakfast?",
buttons:=MessageBoxButton.YesNo,
buttonLabels:=New Dictionary(Of MessageBoxResult, String)() _
From {{MessageBoxResult.Yes, "Yes please!"}})

' Will display a MessageBox with the buttons "Yes Please!" and "No, thanks"

定制按钮显示枚举值(Custom Button Set)

MessageBoxViewModel.ButtonToResults 字典为每个 MessageBoxButton 指定显示哪些按钮的枚举值。想要同时显示 “OK“,“Yes” 和 “No” 按钮吗? 修改这个字典就可以了。

定制图标(Custom Icons)

MessageBoxViewModel.IconMapping 字典指定不同的 MessageBoxImage 的值显示对应的图标。这个字典必须包含MessageBoxImage 所有可能的 Key 值 (注意不同的 Key 值在这里允许有相同的 Value 值),一个值也可以是null,在这种情况下不会显示任何图标。

定制音效(Custom Sounds)

MessageBoxViewModel.SoundMapping 是一个字典,它为每个 MessageBoxImage 指定应该播放哪个声音。与 IconMapping 一样,MessageBoxImage 的每个值都必须有一个键值对,null也是一个有效值(在这种情况下不播放声音)。

定制文本流向和文本对齐方式(Custom FlowDirection and TextAlignment)

IWindowManager.ShowMessageBox() 的参数允许您指定 FlowDirectionTextAlignment

如果不指定这些参数,则使用默认的 MessageBoxViewModel.FlowDirectionMessageBoxViewModel.TextAlignment 使用。

如果愿意,您也可以更改这些默认值。