このトピックには、カスタムクラスの作成からサードパーティのライブラリの使用まで、さまざまな答えがあります。素敵なビジュアルを備えたクールなポップアップが必要な場合は、サードパーティのライブラリを使用すると思います。
ただし、WPFアプリにMicrosoftの通常のメッセージボックスを使用したい場合は、MVVM/単体テストに適した実装を次に示します。
最初は、メッセージボックスから継承してインターフェイスでラップするだけだと思っていましたが、メッセージボックスにパブリックコンストラクタがないためにできませんでした。そのため、「簡単な」解決策を次に示します。
Visual Studioでメッセージボックスを逆コンパイルすると、すべてのメソッドのオーバーロードが表示されます。必要なメソッドをチェックしてから、新しいクラスを作成してメソッドを追加し、インターフェイスとta-daでラップしました。これで、ninjectを使用してインターフェイスとクラスをバインドし、それを注入して、Moqを使用して単体テストなどを行うことができます。
インターフェイスを作成します(すべてを必要としないため、オーバーロードの一部のみを追加しました):
public interface IMessageBox
{
/// <summary>Displays a message box that has a message, title bar caption, and button; and that returns a result.</summary>
MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button);
/// <summary>Displays a message box that has a message, title bar caption, button, and icon; and that returns a result.</summary>
MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon);
/// <summary>Displays a message box that has a message and title bar caption; and that returns a result.</summary>
MessageBoxResult Show(string messageBoxText, string caption);
}
次に、それを継承するクラスがあります。
public class MessageBoxHelper : IMessageBox
{
/// <summary>Displays a message box that has a message, title bar caption, button, and icon; and that returns a result.</summary>
public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button,
MessageBoxImage icon)
{
return MessageBox.Show(messageBoxText, caption, button, icon, MessageBoxResult.None,
MessageBoxOptions.None);
}
/// <summary>Displays a message box that has a message, title bar caption, and button; and that returns a result.</summary>
public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button)
{
return MessageBox.Show(messageBoxText, caption, button, MessageBoxImage.None, MessageBoxResult.None,
MessageBoxOptions.None);
}
/// <summary>Displays a message box that has a message and title bar caption; and that returns a result.</summary>
public MessageBoxResult Show(string messageBoxText, string caption)
{
return MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None,
MessageBoxResult.None, MessageBoxOptions.None);
}
/// <summary>Displays a message box that has a message and that returns a result.</summary>
public MessageBoxResult Show(string messageBoxText)
{
return MessageBox.Show(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None,
MessageBoxResult.None, MessageBoxOptions.None);
}
}
注入などの場合にこれを使用すると、ブームuには、トリックを実行する薄っぺらな抽象化があります...これは、使用する場所によっては問題ありません。私の場合は、いくつかのことを行うことだけを目的とした単純なアプリなので、ソリューションを設計することに意味はありません。これが誰かを助けることを願っています。