libro
www.tuyano.com
C#ではじめるWindows 8アプリ開発入門

メッセージダイアログとポップアップメニュー (3/5)

作成:2014-02-01 11:48
更新:2014-02-01 11:48

■コマンドボタンごとに処理を用意する

返値を使ったやり方はとてもシンプルにボタンの処理を実装できますが、しかし複雑な処理になるとちょっとメソッドが肥大化して面倒くさいことになりそうですね。

こうした場合は、押したボタンごとに処理を整理して組み込めると便利です。そのためには、UICommandの作成時に、メソッドをハンドリングするためのクラスを用意してやります。

●UICommandインスタンスの作成
変数 = new UICommand( テキスト , 
    《UICommandInvokedHandler》);

UICommandインスタンス作成には2つの引数が必要です。1つ目のテキストは、ダイアログに表示されるボタンのテキストとして使われます。2つ目の「UICommandInvokeHandler」というややこしそうなものが、このUICommandで実行する処理をハンドリングするためのクラスです。これを使って、「どの処理を実行するためのコマンドか」を設定するのですね。

●UICommandInvokedHandlerインスタンスの作成
変数 = new UICommandInvokedHandler( メソッドの指定 );
UICommandInvokedHandlerインスタンスは、引数にメソッドを指定してインスタンスを作成します。これで、そのメソッドを呼び出すためのインスタンスが作成されます。


■サンプルを動かしてみる
実際にUICommandを使ってみましょう。下のリスト欄に簡単なサンプルを挙げておきました。これを実行すると、TextBoxに入力したテキストを元にメッセージを表示し、そこに「OK」「No...」という2つのボタンを表示します。そしてボタンをクリックすると、ダイアログが消え、押したボタンに応じたメッセージがTextBlockに表示されます。

ここでは、2つのUICommandを作成しています。以下の部分ですね。
UICommand cmd1 = new UICommand("OK", new 
    UICommandInvokedHandler(this.msgdlog_result_ok));
UICommand cmd2 = new UICommand("No...", new
    UICommandInvokedHandler(this.msgdlog_result_no));
引き数にはUICommandInvokedHandlerが用意されていますが、その引き数にはそれぞれmsgdlog_result_okmsgdlog_result_noというメソッドが指定されています。では、これらのメソッドはどうなっているのでしょうか。
private void msgdlog_result_ok(IUICommand command){……}
private void msgdlog_result_no(IUICommand command){……}
先ほどUICommandInvokedHandlerの引数に指定されていたものですね。これらのメソッドでは、引数にIUICommandが渡されています。これで、クリックしたボタンのUICommandが得られます。後は、それぞれのボタンに応じた処理をすればいい、というわけです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace MyWin8App
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void button1_click(object sender, RoutedEventArgs e)
        {
            string msg = "Hello, " + textbox1.Text + "!";
            MessageDialog dlog = new MessageDialog(msg,"Hello");

            UICommand cmd1 = new UICommand("OK", 
                        new UICommandInvokedHandler(this.msgdlog_result_ok));
            UICommand cmd2 = new UICommand("No...", 
                        new UICommandInvokedHandler(this.msgdlog_result_no));
            dlog.Commands.Add(cmd1);
            dlog.Commands.Add(cmd2);
            await dlog.ShowAsync();
        }

        private void msgdlog_result_ok(IUICommand command)
        {
            textblock1.Text = "OKしました。";
        }

        private void msgdlog_result_no(IUICommand command)
        {
            textblock1.Text = "……何かご不満でも?";
        }
        
    }
}

※関連コンテンツ

「C#ではじめるWindows 8アプリ開発入門」に戻る