ユニバーサルアプリでメッセージボックスを表示するコードを紹介します。
概要
ユニバーサルアプリでメッセージボックスを表示する場合は、Windows.UI.Popups.MessageDialog クラスを利用します。
プログラム例
UI
Visual Studioを起動し、空のユニバーサルアプリを作成します。MainPage.xamlを開きます。下図のフォームデザイナが表示されます。
ツールボックスから[Button]をクリックして選択し、フォームデザイナにドロップします。フォームデザイナにButtonコントロールが配置されます。
プロパティウィンドウを表示し、イベント一覧を表示し、Clickイベントを実装します。
コード
下記のコードを記述します。
ボタンコントロールのClickイベントハンドラ"button_Click"を実装します。
また、イベントハンドラの自動生成されたコードである下記
private void button_Click(object sender, RoutedEventArgs e)
を
private async void button_Click(object sender, RoutedEventArgs e)
に変更します。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
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;
using Windows.UI.Popups;
// 空白ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 を参照してください
namespace MessageDialogDemo
{
/// <summary>
/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void button_Click(object sender, RoutedEventArgs e)
{
MessageDialog md = new MessageDialog("ボタンがクリックされました。");
await md.ShowAsync();
}
}
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[Button]をクリックします。下図のダイアログボックスが表示されます。
補足:async awaitを指定しない場合
下記コードでasync await を指定しない場合でもダイアログボックスは表示されます。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
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;
using Windows.UI.Popups;
// 空白ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 を参照してください
namespace MessageDialogDemo
{
/// <summary>
/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
MessageDialog md = new MessageDialog("ボタンがクリックされました。");
md.ShowAsync();
}
}
}
ただし、ダイアログボックスの表示後に処理が実装されている場合は、予期しない動作になります。
また、下図の
この呼び出しを待たないため、現在のメソッドの実行は、呼び出しが完了するまで続行します。呼び出しの結果に 'await' 演算子を適用することを検討してください。
のワーニングが表示されます。
具体例として、下記コードの場合の動作を紹介します。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
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;
using Windows.UI.Popups;
// 空白ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 を参照してください
namespace MessageDialogDemo
{
/// <summary>
/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
MessageDialog md = new MessageDialog("ボタンがクリックされました。");
md.ShowAsync();
MessageDialog md2 = new MessageDialog("次のメッセージ");
md2.ShowAsync();
MessageDialog md3 = new MessageDialog("その次のメッセージ");
md3.ShowAsync();
}
}
}
実行結果
上記コードのプロジェクトを実行します。下図のウィンドウが表示されます。
[Button]をクリックするとダイアログボックスが表示されます。
一見問題なさそうですが、ダイアログボックスを移動すると、ダイアログボックスが複数表示されていることが確認できます。
MessageDialog クラスの ShowAsync() メソッドは非同期メソッドのため、実行後ダイアログのクローズを待たずに、すぐに次の行を処理します。そのため、複数のダイアログボックスが表示される動作になってしまいます。
対策
正しく動作させるためには、冒頭で紹介した、asyn await を利用します。下記コードを記述します。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
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;
using Windows.UI.Popups;
// 空白ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 を参照してください
namespace MessageDialogDemo
{
/// <summary>
/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void button_Click(object sender, RoutedEventArgs e)
{
MessageDialog md = new MessageDialog("ボタンがクリックされました。");
await md.ShowAsync();
MessageDialog md2 = new MessageDialog("次のメッセージ");
await md2.ShowAsync();
MessageDialog md3 = new MessageDialog("その次のメッセージ");
await md3.ShowAsync();
}
}
}
プロジェクトを実行します。下図のウィンドウが表示されます。[Button]をクリックします。
メッセージダイアログが表示されます。ダイアログボックスの[OK]ボタンをクリックします。
次のメッセージダイアログボックスが表示されます。ダイアログボックスの[OK]ボタンをクリックします。
3つ目のメッセージダイアログボックスが表示されます。
async awaitを利用することで、MessageDialog クラスの ShowAsync() メソッドで処理を待つ動作にできます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2017-09-09
作成日: 2016-04-25