酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Phoneでメッセージボックスを表示する

概要

デスクトップWindowsでもユーザーに対する警告や注意、実行結果の表示など様々なシーンにおいて用いられる機能のひとつです。Windows Phoneにおいてもメッセージボックス上にアイコンが表示されない事を除き、デスクトップWindowsと同様に扱うことが可能です。

f:id:ch3cooh393:20141127110143p:plain

ユーザー応答型のメッセージボックスを表示します。

名前空間:System.Windows

System.Object
 +--System.Windows.MessageBox

Tips

メッセージボックスはモーダルとして表示され、その間アプリケーションのクライアント領域に触れることが出来ません。

MessageBoxクラスを使ってメッセージボックスを表示する方法や、XNA FrameworkのGuide.BeginShowMessageBoxメソッドを使ってメッセージボックスのボタンラベル([ok]や[キャンセル]と表示されている部分)を任意のテキストで書き換えて表示する方法についてご紹介します。

MessageBoxクラスにはShowメソッドが提供されており、このメソッドを使用してメッセージボックスを表示します。Showメソッドはオーバーロードで2通りの使い方が出来るようになっています。

メッセージのみのメッセージボックスを表示する

MessageBox.Show(String text)メソッドを使用して、メッセージのみのメッセージボックスを表示します。ボタンは[ok]の1つしか表示されませんので、ユーザーはこれから起こることを回避することが出来ません。このメッセージボックスは、なんらかの処理後の成功・失敗の通知に使用すると良いでしょう。

f:id:ch3cooh393:20141127110202p:plain

button1のボタンがクリックされた時に、MessageBox.Show(String)メソッドを使用してメッセージボックスを表示しています。

using System;
using System.Windows;
using Microsoft.Phone.Controls;

namespace MessageboxTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e) {
            // メッセージボックスを表示
            MessageBox.Show("処理を実行する準備が整いました");
        }
    }
}

キャプションとメッセージのメッセージボックスを表示する

MessageBox.Show(String text, String caption, MessageBoxButtons buttons)メソッドを使用して、キャプションとメッセージのメッセージボックスを表示します。ユーザーにキャンセルを選択させることが出来るので、このメッセージボックスは、何らかの削除処理など処理前に「本当に実行してもよいのか?」とユーザーに問い合わせる手段として用いると良いでしょう。

f:id:ch3cooh393:20141127110222p:plain

ボタンラベルは第3引数のパラメータによって決定されます。Windows Phone OS 7.1では、MessageBoxButton.OK(okボタンのみ)とMessageBoxButton.OKCancel(okとキャンセルボタン)が定義されています。 button1のボタンがクリックされた時に、MessageBox.Show(String, String, MessageBoxButtons)メソッドを使用してメッセージボックスを表示しています。

using System;
using System.Windows;
using Microsoft.Phone.Controls;

namespace MessageboxTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e) {
            // メッセージボックスを表示
            MessageBox.Show("処理を実行する準備が整いました。実行しますか?", 
                "確認", MessageBoxButton.OKCancel);
        }
    }
}

任意のボタンラベルのメッセージボックスを表示する(上級者向け)

MessageBox.Showメソッドでのボタンラベルの定義は、[ok]と[キャンセル]の組み合わせでしか存在しませんでした。デスクトップWindowsのメッセージボックスの場合ですと [再試行]や[無視]なども定義されています。Windows Phoneでは、メッセージボックスに[ok]と[キャンセル]ボタン以外を表示させることは出来ないのでしょうか? XNA Frameworkを使うことで、下図のような任意のボタンラベルのメッセージボックスを表示させることが出来ます。

f:id:ch3cooh393:20141127110238p:plain

Microsoft.Xna.Framework.GamerServices名前空間のGuideクラスを利用します。GuideクラスにはGuide.BeginShowMessageBoxメソッドが存在しており、第3パラメータにボタンのラベルを指定することが出来ます。

using System;
using System.Windows;
using Microsoft.Phone.Controls;

namespace MessageboxTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        private void button2_Click(object sender, RoutedEventArgs e) {
            // NOTE: メッセージボックスのボタンは2つまで
            var buttonLabels = new List<string>();
            buttonLabels.Add("右");
            buttonLabels.Add("左");

            // NOTE: メッセージはnullや空文字列だとエラーが発生する
            var msg = "どちらに進みますか?";
            var title = "確認";

            // メッセージボックスを表示
            Guide.BeginShowMessageBox(title, msg, buttonLabels, 
                0, MessageBoxIcon.Alert, asyncCallback, null);
        }

        private void asyncCallback(IAsyncResult asyncResult) {
            // ユーザーが選択したボタンのインデックスを取得する
            var result = Guide.EndShowMessageBox(asyncResult);
        }
    }
}

Windows Phoneプラットフォーム全体で一貫したユーザーエクスペリエンスを提供する方向性とは異なるため、選択肢が他と異なるこのTipsはあまり多用すべきではないでしょう。

以下の記事「Windows Phoneで任意のテキストラベルのボタンを表示するクラスを作る - 酢ろぐ!」にて、より簡単に任意のラベルを表示させるメッセージダイアログを表示するMessageBoxExtentionsクラスについて紹介しています。

参照