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("眠たい?");
こんだけ。
と、使うのは簡単だけど、ここまでやる必要あったのかな???
それに、拡張メソッドを使ったメリットは、特にない気も.....