[Windows ストア アプリ] メッセージダイアログを表示する(3)

これまで

とMessageDialogに関する使用方法を紹介していきました。

今回は、MessageDialogの既定のボタンを設定する方法について紹介します。

ソースコードは前回紹介したものを使用します。


MessageDialogに追加したボタンは、既定のボタンを設定することができます。

「既定のボタン」とは、表示されたときに強調表示されるボタンで、[Enter]キーが押されると既定でイベントが発生するボタンになります。

既定のボタンはMessageDialogクラスDefaultCommandIndexプロパティで設定することができます。

1番最初に追加したボタンはインデックスが0となり、2番目に追加したボタンのインデックスは1となります。

下記は、DefaultCommandIndexプロパティに1を設定して、2番目に追加した[Cancel]ボタンを既定のボタンとする例です。

VBの例

Private Async Sub btnMessage_Click(sender As Object, e As RoutedEventArgs) Handles btnMessage.Click
    Dim md As New MessageDialog("Hello, Windows Store Application!!", "First MessageDialog App")

    Dim uicOK As New UICommand("OK", New UICommandInvokedHandler(AddressOf CommandInvokedHandler))
    Dim uicCancel As New UICommand("Cancel", New UICommandInvokedHandler(AddressOf CommandInvokedHandler))

    md.Commands.Add(uicOK)
    md.Commands.Add(uicCancel)

    '既定のボタンを[Cancel]ボタンに設定する
    md.DefaultCommandIndex = 1

    Await md.ShowAsync()
End Sub

C#の例

private async void btnMessage_Click(object sender, RoutedEventArgs e)
{
    MessageDialog md = new MessageDialog("Hello, Windows Store Application!!","First MessageDialog App");

    UICommand uicOK = new UICommand("OK", new UICommandInvokedHandler(this.CommandInvokedHandler));
    UICommand uicCancel = new UICommand("Cancel", new UICommandInvokedHandler(this.CommandInvokedHandler));

    md.Commands.Add(uicOK);
    md.Commands.Add(uicCancel);

    // 既定のボタンを[Cancel]ボタンに設定する
    md.DefaultCommandIndex = 1;

    var x = await md.ShowAsync();
}

上記を入力後、[F5]キーを押して実行し[Button]をクリックすると、下図のように[Cancel]ボタンが強調表示されます。

[Enter]キーを押すと、[Cancel]がクリックされたものとみなされます。

[Windows ストア アプリ] メッセージダイアログを表示する(2)

前回に引き続き、今回もメッセージダイアログの使用方法について紹介します。

今回は、メッセージダイアログに複数のボタンを表示する方法について見ていきます。

ソースコードは前回紹介したものに追記していきます。


MessageDialogに表示するボタンを作成するには UICommandクラスを使用します。

UICommandクラスもMessageDialogクラスと同様にWindows.UI.Popups名前空間にあります。

UICommandクラスのインスタンスは、下記のようにして作成します。

ここではOKとCancelの2つのボタンを追加します。

UICommandのコンストラクタの第1引数にはボタンに表示するメッセージを、第2引数にはボタンがクリックされたときに実行するイベントハンドラを登録します。

また、作成したUICommandは、MessageDialogのCommandsプロパティが持つAddメソッドで追加します。

ボタンは最大で3つまで登録することができます。

VB

Private Async Sub btnMessage_Click(sender As Object, e As RoutedEventArgs) Handles btnMessage.Click
    Dim md As New MessageDialog("Hello, Windows Store Application!!", "First MessageDialog App")

    Dim uicOK As New UICommand("OK", New UICommandInvokedHandler(AddressOf CommandInvokedHandler))
    Dim uicCancel As New UICommand("Cancel", New UICommandInvokedHandler(AddressOf CommandInvokedHandler))

    md.Commands.Add(uicOK)
    md.Commands.Add(uicCancel)

    Await md.ShowAsync()
End Sub

C#

private async void btnMessage_Click(object sender, RoutedEventArgs e)
{
    MessageDialog md = new MessageDialog("Hello, Windows Store Application!!","First MessageDialog App");

    UICommand uicOK = new UICommand("OK", new UICommandInvokedHandler(this.CommandInvokedHandler));
    UICommand uicCancel = new UICommand("Cancel", new UICommandInvokedHandler(this.CommandInvokedHandler));

    md.Commands.Add(uicOK);
    md.Commands.Add(uicCancel);

    var x = await md.ShowAsync();
}

さて、上記でMessageDialogに2つのボタンを追加することができました。

今度はボタンが押されたことをイベントで拾えるようにします。

先ほど、UICommandで登録したイベントハンドラは下記のように記述します。

ボタンがクリックされると、登録したイベントハンドラ(CommandInvokedHandler)が起動し、引数 IUICommand には押されたボタンの情報が入ってきます。

Select Caseを使用し(C#はswitch)、IUICommand の Labelプロパティを参照して押されたボタンを判断します。

VB

Private Sub CommandInvokedHandler(command As Windows.UI.Popups.IUICommand)
    Dim a As Integer
    Select Case command.Label
        Case "OK"
            '[OK]が押された処理をここに記述
        Case "Cancel"
            '[Cancel]が押された処理をここに記述
    End Select
End Sub

C#

private void CommandInvokedHandler(IUICommand command)
{
    switch (command.Label)
    {
        case "OK":
            // [OK]が押された処理をここに記述
            break;
        case "Cancel":
            // [Cancel]が押された処理をここに記述
            break;
    }
}

ここまでの入力が完了したら、[F5]を押して実行します。

下記のように[OK][Cancel]がMessageDialogに表示されます。

[Windows ストア アプリ] メッセージダイアログを表示する(1)

Windowsアプリケーションでは、メッセージボックスの表示はMessageBoxクラスを使用していましたが、Windows ストア アプリではMessageDialogクラスを使用します。

まずは、簡単なサンプルを作成しながら確認をしていきたいと思います。

下準備

まずはMessageDialogをテストするためのプロジェクトを作成します。

Visual Studio 2012を起動したら、「新しいプロジェクト」で[Windows ストア]-[新しいアプリケーション(XAML)]を選択して、「MessageDialogSample」という名前を付けます(任意の名前でかまいません)。

次に「ソリューションエクスプローラー」で「MainPage.xaml」をダブルクリックして表示させ、「ツールボックス」で「Buttonコントロール」をダブルクリックして任意の位置に配置します。

配置した「Buttonコントロール」には任意の名前を付けます。ここでは「btnMessage」としました。

次に、btnMessageをダブルクリックして、Clickイベントを作成します。

VB

Private Sub btnMessage_Click(sender As Object, e As RoutedEventArgs) Handles btnMessage.Click

End Sub

C#

private void btnMessage_Click(object sender, RoutedEventArgs e)
{

}

以上でMessageDialog確認用の下準備が完了です。


実装

MessageDialogクラスは、Windows.UI.Popups名前空間にあるので下記のようにusingやImportsを追加しておきましょう。

VB

Imports Windows.UI.Popups

C#

using Windows.UI.Popups;

次にMessageDialogのインスタンスを作成します。
MessageDialogのコンストラクタの第1引数には表示するメッセージを、第2引数にはダイアログのタイトルを指定します。

先ほど作成しておいたbtnMessageのClickイベントに下記のように記述します。

VB

Private Sub btnMessage_Click(sender As Object, e As RoutedEventArgs) Handles btnMessage.Click
    Dim md As New MessageDialog("Hello, Windows Store Application!!", "First MessageDialog App")
End Sub

C#

private void btnMessage_Click(object sender, RoutedEventArgs e)
{
    MessageDialog md = new MessageDialog("Hello, Windows Store Application!!","First MessageDialog App");
}

MessageDialogを表示するにはShowAsyncメソッドを使用します。

ShowAsyncメソッドは非同期なメソッドであるため、実行するにはAwait演算子(C#はawait演算子)が必要です。

また、メソッド内にAwait演算子が含まれている場合は、メソッドをAsync修飾子(C#はasync修飾子)で修飾する必要があります。

VB

Private Async Sub btnMessage_Click(sender As Object, e As RoutedEventArgs) Handles btnMessage.Click
    Dim md As New MessageDialog("Hello, Windows Store Application!!", "First MessageDialog App")

    Await md.ShowAsync()
End Sub

C#

private async void btnMessage_Click(object sender, RoutedEventArgs e)
{
    MessageDialog md = new MessageDialog("Hello, Windows Store Application!!","First MessageDialog App");

    await md.ShowAsync();
}

上記を入力し終えたら、[F5]キーを押して実行してみましょう。

[Button]をクリックすると、MessageDialogが表示されます。