かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

ネットワークの接続状態を確認する

UWPでインターネットの接続状態を確認するには、NetworkInformationクラスを使います。

NetworkInformationクラスのGetInternetConnectionProfileでインターネット接続へのConnectionprofileクラスが取得できます。これに対して、GetNetworkConnectivityLevelを呼び出すとネットワークの接続状態が取れます。NetworkInformationクラスの状態が変わったときに発生するイベントのNetworkStatusChangedイベントを組み合わせると、ネットワークの状態をリアルタイムに表示することが出来ます。

画面にTextBlockをTextBlockという名前でおいて以下のコードをコードビハインドに書くとネットワークの状況に応じて接続状況が画面に表示されるようになります。

using System;
using Windows.Networking.Connectivity;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

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

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            NetworkInformation.NetworkStatusChanged += this.NetworkInformation_NetworkStatusChanged;
            this.NetworkInformation_NetworkStatusChanged(null);
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            NetworkInformation.NetworkStatusChanged -= this.NetworkInformation_NetworkStatusChanged;
        }

        private async void NetworkInformation_NetworkStatusChanged(object sender)
        {
            var ni = NetworkInformation.GetInternetConnectionProfile();
            if (ni != null)
            {
                var text = default(string);
                if (ni.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess)
                {
                    text = "接続中";
                }
                else
                {
                    text = "接続中ではありません。";
                }

                if (this.Dispatcher.HasThreadAccess)
                {
                    this.TextBlock.Text = text;
                }
                else
                {
                    await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        this.TextBlock.Text = text;
                    });
                }
            }
        }
    }
}

f:id:okazuki:20160305172103p:plain