« 2013年6月9日 - 2013年6月15日 | トップページ | 2013年7月7日 - 2013年7月13日 »

2013.07.01

[WinRT]MessageDialogを表示する

WinRTでは、MessageBoxがない。そのため、Windows.UI.Popups.MessageDialogを表示する。いままでの、「Yes」/「No」を問い合わせるために「UICommand」をわたしたりと大変。

var dialog = new MessageDialog("眠たい?");
dialog.Commands.Add(new UICommand("はい",(command)=>{Debug.WriteLine("眠たいです。");}));
dialog.Commands.Add(new UICommand("いいえ",(command)=>{Debug.WriteLine("眠たくないです。");}));
await dialog.ShowAsync();

ここで、C#では、拡張メソッドというのがあって、クラス自体を拡張できる。そこで、AddCommand(string,int)で受け取るものを考えてあげると、もう少し簡単になるはず。ということで、

public static class MessageDialogExtentions
{
    public const int Yes = 1;
    public const int No = 0;
    public const int Cancel = -1;
    private static int result;
    public static async Task<int> GetAsync(this MessageDialog self)
    {
         result = Cancel;
         await ShowAsync();
         return result;
    }
    public static MessageDialog AddCommand(this MessageDialog self, string label, int no)
    {
        self.Commands.Add(new UICommand(label, (command)=>{ result = no });
        return self;
    }
}

のようなものを考えた。すると、

var ans = await new MessageDialog("眠たい?").AddCommand("はい",Yes).AddCommand("いいえ",No).GetAync();
if(ans==Yes)
{
    Debug.WriteLine("眠たいです。");
}
if(ans==No){
    Debug.WriteLine("眠たくないです。");
}

のようになる。でも、次のことが気になる。

AddCommand("はい",Yes)とかが冗長
AddYes()を追加してあげる。さらに、YesNoだけのメソッドを追加。
static int resultが微妙。
大丈夫だろうけど、残念。

とくに2番目のは気になる......

......

......


そういえば、ShowAsyncって何を返すんだっけ?と調べてみると、押されたボタンのIUICommandを返すらしい。さらに、IUICommandはobject Idも持っている。じゃあ、object Idにintを渡せば解決!

で、結局こんな感じ。

public static class MessageDialogExtentions
{
    public const int Yes = 1;
    public const int No = 0;
    public const int Cancel = -1;
    public static async Task

YesNoAsync(string content)     {         return await new MessageDialog(content).AddYes().AddNo().GetAsync();     }     public static async Task

GetAsync(this MessageDialog self)     {          IUICommand command = await ShowAsync();          return (int)command.Id;     }     public static MessageDialog AddCommand(this MessageDialog self, string label, int no)     {         self.Commands.Add(new UICommand(label) { Id = no });         return self;     }     public static MessageDialog AddYes(this MessageDialog self)     {        return AddYes(self, "はい", Yes);     }     public static MessageDialog AddNo(this MessageDialog self)     {         return AddNo(self, "いいえ", No);     } }

使うときには、

var ans = await new MessageDialogExtentions.YesNoAsync("眠たい?");

こんだけ。
と、使うのは簡単だけど、ここまでやる必要あったのかな??? それに、拡張メソッドを使ったメリットは、特にない気も.....

| | コメント (0) | トラックバック (0)

« 2013年6月9日 - 2013年6月15日 | トップページ | 2013年7月7日 - 2013年7月13日 »