ユニバーサルアプリでメッセージボックスを表示する - UWP

ユニバーサルアプリでメッセージボックスを表示するコードを紹介します。

概要

ユニバーサルアプリでメッセージボックスを表示する場合は、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
iPentec all rights reserverd.