連載:Silverlight 3実践プログラミング

ネットワーク監視APIとブラウザ外実行

シグマコンサルティング 菅原 英治
2009/12/04
Page1 Page2

 みなさん、こんにちは。本連載では、Silverlight 3の新機能について、その場で実行可能なサンプルと、そのコードを示しながら解説しています。前回は、SaveFileDialogとBitmap APIについて解説しました。連載第3回目となる今回は、次の2点について解説します。

【本稿で解説するSilverlight 3の新機能】

(1)ネットワーク監視API
(2)ブラウザ外実行(=アウト・オブ・ブラウザ体験)

 ネットワーク監視APIは、Silverlightアプリケーション(以下、アプリ)上で、それを実行しているコンピュータのネットワークが有効かどうかや、ネットワークの状態の変更(有効/無効)を検知するためのクラス群です。

 ブラウザ外実行とは、Webブラウザの外でデスクトップ・アプリとしてSilverlightアプリを実行する機能です。その際、利用するコンピュータには、追加のプラグインなどをインストールする必要がありません。またブラウザ外実行は、次期バージョンのSilverlight 4においてさらに機能が拡張される予定で、注目の機能といえます(その詳細は本稿のコラムで後述します)。

 また、この2つの機能は、併用して利用する場合が多いとは思われますが、本質的には独立した別々の機能であることを理解してください。例えば、ネットワークを監視する必要のないブラウザ外実行アプリや、逆にブラウザ内で実行する場合でもネットワークを監視したい場合もあり得ます。

 本連載の対象読者としては、.NETでの開発経験があり、かつSilverlight 2アプリの開発についてある程度の知識がある方を前提に考えています。また、本稿では、次の開発環境を前提としています。

【本稿で前提とする開発環境】

 それではさっそく始めましょう! まずはネットワーク監視APIを利用したサンプル・アプリを実際に動かしてみましょう。

【コラム】Silverlight 4ベータ版リリース

 恐れていたことが起こりました。ひょっとしたら起こり得るかもしれないと、うすうす感じていましたが、本連載が完了する前にSilverlight 4のベータ版がリリースされてしまいました。

 注目される機能としては、アプリへのドラッグ&ドロップや右クリック、印刷のサポート、Webカメラ対応などがあります。先日、米国ロサンゼルスで開催された開発者向けカンファレンス「PDC 2009」では、その新機能を概説するセッションがありました。次のリンクからそのセッションが見られます。英語ですが、デモを動かしながらのセッションで、内容は分かりやすいです。ぜひご覧ください。

 Silverlight 4において、個人的にうれしいのは、地味ですがコントロール用のビルトインのマウス・ホイール・スクロールの対応です。Silverlight 3では、標準ではマウス・ホイール・スクロールに対応しておらず、自前でそのコードを書く必要があったからです。

 また、右クリックで表示されるコンテキスト・メニューを完全に制御できるのもうれしいですね(その様子は上記セッションのデモの中で確認できます)。これは、デフォルトのメニュー(たとえば「Adobe Flash Palyer 10について」のような)が必ず表示されてしまうFlashと比較して、アドバンテージがあるといえるでしょう。

ネットワーク監視API

ネットワーク監視APIとは

 それでは、ネットワーク監視APIについて解説します。繰り返しになりますが、ネットワーク監視APIを使うと、Silverlightアプリ上で、それを実行しているコンピュータのネットワークが有効かどうかを確認することができます。

 また、有効かどうかを確認するだけではなく、ネットワーク状態が変更(例えば有効から無効、無効から有効)されたタイミングを検知することもできます。

 次のサンプルを動かして、その機能を実感してみましょう。

サンプルを動かしてみよう

 それでは、ネットワーク監視APIを利用したサンプルを動かしてみましょう(サンプルを動作させるためには、「Silverlightプラグインのインストール」が必要です)。

Microsoft Silverlight を入手
ネットワーク監視APIを利用したサンプル
ネットワークの状態を検知するSilverlight 3アプリ。
  ネットワークが有効なときは画面上に「オンライン」と表示される。
  ネットワークが無効なときは画面上に「オフライン」と表示される。

 サンプル上において、恐らくほとんどの方が「オンライン」と表示されているでしょう。いままさに、本稿をご覧になれているということは、ネットワーク設定が有効であるからです。

 それでは、ネットワークを無効にしてみましょう。Windows(Vistaおよび7)の場合、[コントロール パネル]−[ネットワークと共有センター]−[アダプターの設定の変更]から、現在利用しているネットワークを右クリックし[無効にする]を実行します。

当然ながら、ネットワークにアクセスできなくなりますのでご注意ください

ネットワークを無効にする方法

 すると、ネットワークを無効にすると同時に、サンプル上の文字が、「オンライン」から「オフライン」に変更されることが確認できます。再度、ネットワークを有効にしてみましょう。今度は、「オフライン」から「オンライン」に変更されることが確認できます。

 このように、ネットワーク監視APIを利用すると、現在ネットワークが有効かどうかと、ネットワークの状態が変化したときを検知することができます。それでは続いて、サンプル・アプリのソース・コードを解説しましょう。

サンプル・アプリのソース・コード解説

 ネットワーク監視APIを利用したサンプル・アプリのソース・コードを解説します。まずは、画面の定義を行うXAMLコードからです。

XAMLコードの解説

 Visual Studioで、新しいSilverlightアプリケーション作成したら、MainPage.xamlファイルに次のコードを記述します。今回のアプリケーションでは、XAMLコードは実はさほど重要なポイントはないので、簡単に解説します。

 まず太字で最初に示したステータス表示用テキストを用意します。また2つのストーリーボード(=「オンライン」から「オフライン」に変更した場合と、「オフライン」から「オンライン」に変更した場合のアニメーションを定義)を用意しています。ストーリーボードを利用する必要はまったくないのですが、少しくらいSilverlightらしくアニメーションを利用したインタラクティブな感じにしたかったので、利用してみました。

<UserControl ……(略)……>

  <Grid x:Name="LayoutRoot" Width="400" Height="200" Background="Azure" >
    <!--ステータス表示用テキスト-->
    <TextBlock x:Name="statusText" FontSize="60"/>
  </Grid>

  <UserControl.Resources>
    <Storyboard x:Name="onlineStoryboard">
      <ColorAnimation Storyboard.TargetName="statusText" 
          Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)"
          To="Red" />
      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="statusText"
          Storyboard.TargetProperty="(TextBlock.Text)" >
        <DiscreteObjectKeyFrame KeyTime="0"  Value="オンライン"/>
      </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Name="offlineStoryboard">
      <ColorAnimation Storyboard.TargetName="statusText" 
          Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" 
          To="Blue" />
      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="statusText"
          Storyboard.TargetProperty="(TextBlock.Text)" >
        <DiscreteObjectKeyFrame KeyTime="0" Value="オフライン"/>
      </ObjectAnimationUsingKeyFrames>
    </Storyboard>
  </UserControl.Resources>
</UserControl>
画面の定義を行うXAMLコード(MainPage.xamlファイル)

コード・ビハインド・コードの解説

 続いて、ネットワーク監視APIを利用したサンプル・アプリのロジックを記述するコード・ビハインド・コード(MainPage.xaml.vbファイル/MainPage.xaml.csファイル)について解説しましょう。以下にそのコードを示します。

Imports System.Net.NetworkInformation

Partial Public Class MainPage
  Inherits UserControl

  Public Sub New()
    InitializeComponent()

    ' ネットワーク設定変更のイベント・ハンドラを登録する
    AddHandler NetworkChange.NetworkAddressChanged, _
      AddressOf NetworkChange_NetworkAddressChanged

    ' 初回時のネットワーク設定をチェックする
    CheckNetwork()

  End Sub

  ' ネットワーク設定をチェックする
  Private Sub CheckNetwork()

    ' ネットワークが有効か
    If (NetworkInterface.GetIsNetworkAvailable()) Then
      ' 有効な場合、オンライン用のStoryboardを開始する
      onlineStoryboard.Begin()
    Else
      ' 無効な場合、オフライン用のStoryboardを開始する
      offlineStoryboard.Begin()
    End If
  End Sub

  'ネットワーク設定変更のイベント発生時の処理
  Sub NetworkChange_NetworkAddressChanged( _
    ByVal sender As Object, ByVal e As EventArgs)
    CheckNetwork()
  End Sub

End Class
……(略)……
using System.Net.NetworkInformation;

namespace NetworkAPISampleCS
{
  public partial class MainPage : UserControl
  {
    public MainPage()
    {
      InitializeComponent();

      // ネットワーク設定変更のイベント・ハンドラを登録する
      NetworkChange.NetworkAddressChanged +=
        NetworkChange_NetworkAddressChanged;

      // 初回時のネットワーク設定をチェックする
      CheckNetwork();
    }

    // ネットワーク設定をチェックする
    private void CheckNetwork()
    {
      // ネットワークが有効か
      if (NetworkInterface.GetIsNetworkAvailable())
      {
        // 有効な場合、オンライン用のStoryboardを開始する
        onlineStoryboard.Begin();
      }
      else
      {
        // 無効な場合、オフライン用のStoryboardを開始する
        offlineStoryboard.Begin();
      }
    }

    // ネットワーク設定変更のイベント発生時の処理
    void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
    {
      CheckNetwork();
    }
  }
}
ネットワーク監視APIを利用した処理(上:MainPage.xaml.vb、下:MainPage.xaml.cs)

 では、このコードのポイントを解説します。まず、ネットワーク監視APIは、System.Net.NetworkInformation名前空間に定義されています。ですので、その名前空間を利用しやすいように、Import(VBの場合)/using(C#の場合)します。

 次のポイントはNetworkChange.NetworkAddressChangedイベントです。このイベントは、ネットワークの状態が変化したときに発生するイベントです。このイベントを制御することで、ネットワークが変更されたときの処理が行えます。このサンプルでは、ネットワークが変更されたタイミングで、CheckNetworkという自作のメソッドを呼び出しているだけです。

 最後のポイントは、NetworkInterface.GetIsNetworkAvailableメソッドです。このメソッドを利用すると、現在のネットワークが有効(=true)か、無効(=false)かを取得できます。このサンプルでは、上述のCheckNetworkメソッドの中で利用しており、有効の場合はオンライン用のStoryboardを、無効の場合はオフライン用のStoryboardを開始させています。

 ネットワーク監視APIの解説は以上です。比較的簡単なコーディングで、ネットワークの状態を取得できることがご理解いただけたのではないでしょうか。

 この機能を利用すると、例えば、外回りの営業マンの情報入力を支援するアプリに応用できそうです。ネットワークが利用できない状況でも、情報登録を受け付けて(例えば分離ストレージに保存するなどで)、社内に戻りネットワークに接続出来なら社内データベースと同期させる、というようなアプリが実現できそうです。


 INDEX
  連載:Silverlight 3実践プログラミング 
  ネットワーク監視APIとブラウザ外実行
  1.ネットワーク監視API
    2.ブラウザ外実行

インデックス・ページヘ  「Silverlight 3実践プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH