■ イベントハンドラの引数
実際にイベントを使用する際は、先に紹介した<MediaElement>オブジェクトのサンプルのようにXAMLのタグオブジェクト上にイベントハンドラを定義し、(Silverlight 1.0では)JavaScript上にイベントハンドラの処理を記述することになります。
イベントハンドラには、「引数」と呼ばれるパラメータが必ず定義されております。Silverlight 1.0において、一般的には表5のようなパラメータですが、キーボード入力イベントやマウス入力イベントは表6や表7のように複数の値を持つオブジェクトとなりますので、注意する必要があります。
| 引数 | 概要 | |
|---|---|---|
| sender | イベントが発生したSilverlightオブジェクト。パラメータ値のToStringメソッドを使用したり、特定のオブジェクトのプロパティを確認することで、オブジェクトに関する情報を取り出せる | |
| eventArgs | 特定のイベントのためのイベントデータの設定を特定。イベントデータはそれぞれのイベントの発生に関する情報を含む。OnErrorイベントはErrorEventArgsオブジェクトが格納され、MarkerReachedイベントはeventArgs.MarkerでイベントトリガのTimelineMarkerオブジェクトを得ることができるが、それ以外のイベントは常にnull | 
| 引数 | 概要 | |
|---|---|---|
| sender | イベントが発生したSilverlightオブジェクト | |
| keyEventArgs | このパラメータには以下の値が含まれている ・keyEventArgs.Key:対象のキーを表すキーコードの整数値。この値はポータブルキーコードであり、OS特有ではない ・keyEventArgs.PlarformKeyCode:対象のキーを表すキーコードの整数値。この値は非ポータブルキーコードで、OS特有 ・keyEventArgs.Shift:Shiftキーが押されているかを判定するBoolean値 ・keyEventArgs.Ctrl:Ctrlキーが押されているかを判定するBoolean値 | 
| 引数 | 概要 | |
|---|---|---|
| sender | イベントが発生したSilverlightオブジェクト | |
| mouseEventArgs | このパラメータには以下の値が含まれている ・mouseEventArgs.GetPosition(element).X:マウスのX座標位置 ・mouseEventArgs.GetPosition(element).Y:マウスのY座標位置 ・mouseEventArgs.Shift:Shiftキーが押されているかを判定するBoolean値 ・mouseEventArgs.Ctrl:Ctrlキーが押されているかを判定するBoolean値 | 
エラーはどうやってハンドリングする?
Silverlight 1.0のエラーハンドリングは、以下のように3つの方法があります。
- OnErrorイベントハンドラの定義
- JavaScriptのtry/catchブロックを使った同期エラーイベント
- Silverlightの特有のイベントを使った非同期エラーイベント
2つ目に関しては、JavaScript標準の機能ですので、ここでは割愛します。
3つ目に関しては、ImageFailedイベントやMediaFailedイベントなどSilverlightの特有のイベントで定義されているエラーイベントにエラー処理を記述することを指します。このときのイベントの使用方法は通常のイベントと変わりありません。
例えば、今回のアプリケーションにMediaFailedイベントを追加すると、以下のようになります。
<MediaElement x:Name="media" Width="640" Height="480" Source="Silverlight.wmv" AutoPlay="false" Volume="1" MediaFailed="MediaFailedHander"/>
// メディア関連エラーハンドラ
function MediaFailedHander(sender, eventArgs)
{
    // 表示するエラーメッセージ
    var errorMsg = "\n Media Error Message \n" ;
 
    // メディア情報の追加
    errorMsg += "MediaElement Name: " + sender.Name + "\n";
    errorMsg += "Media File Name: " + sender.Source + "\n";
 
    // エラーメッセージの表示
    alert(errorMsg);
}
■ Silverlight 1.0はOnErrorイベントでエラー処理
Silverlight 1.0では、特有のエラーイベントを処理したい場合でなければ、通常はOnErrorイベントを使用します。
表5でも記載したとおり、OnErrorイベントのEventArgsパラメータには、ErrorEventArgsオブジェクトが格納されています。このErrorEventArgsオブジェクトには、ParserErrorEventArgsとRuntimeErrorEventArgsの2つのタイプがあり、それぞれで格納されているデータが異なります。それぞれのデータに関しては表8〜10にまとめました。
| プロパティ | 概要 | |
|---|---|---|
| errorMessage | エラーイベントのメッセージ | |
| errorType | エラーのタイプ。ErrorType列挙型の値として格納 | |
| errorCode | エラーイベントのコード | 
| プロパティ | 概要 | |
|---|---|---|
| charPosition | エラーが発生した文字位置 | |
| lineNumber | エラーが発生した行数 | |
| xamlFile | エラーが発生したXAMLファイル | |
| xmlAttribute | エラーが発生したXML属性 | |
| xmlElement | エラーが発生したXML要素 | 
| プロパティ | 概要 | |
|---|---|---|
| charPosition | エラーが発生した文字位置 | |
| lineNumber | エラーが発生した行数 | |
| methodName | エラーと関係するメソッド | 
OnErrorイベントでこれらすべてのエラー情報をポップアップメッセージとして表示する場合は、以下のようなロジックになります。
onError: function(sender, args) {
    // 表示するエラーメッセージ
    var errorMsg = "Silverlight Error: \n\n";
 
    // すべてのエラーの共通情報
    errorMsg += "Error Type: " + errorArgs.errorType + "\n";
    errorMsg += "Error Message: " + errorArgs.errorMessage + "\n";
    errorMsg += "Error Code: " + errorArgs.errorCode + "\n";
 
    // 特定のエラー情報の追加
    switch(errorArgs.errorType)
    {
    case "RuntimeError":
        // RuntimeErrorEventArgsのプロパティを表示
        if (errorArgs.lineNumber != 0)
        {
            errorMsg += "Line: " + errorArgs.lineNumber + "\n";
            errorMsg += "Position: " + errorArgs.charPosition 
                + "\n";
        }
        errorMsg += "MethodName: " + errorArgs.methodName + "\n";
        break;
    case "ParserError":
        // ParserErrorEventArgsのプロパティを表示
        errorMsg += "Xaml File: " + errorArgs.xamlFile + "\n";
        errorMsg += "Xml Element: " + errorArgs.xmlElement + "\n";
        errorMsg += "Xml Attribute: " + errorArgs.xmlAttribute 
            + "\n";
        errorMsg += "Line: " + errorArgs.lineNumber + "\n";
        errorMsg += "Position: " + errorArgs.charPosition + "\n";
        break;
    default:
        break;
    }
    // エラーメッセージの表示
    alert(errorMsg);
}
なお、このエラーハンドリング処理は特定のエラーハンドリングが必要なければ、このままで再利用できます。
次回からはグラフィックス描画に関する機能
今回のグローアップ・アプリケーションは、まだ2D/3Dグラフィックスやアニメーション、ブラシなどの解説を行っておりませんので、メディアの再生・一時停止・停止とフルスクリーン表示が行えるだけで、後はエラーハンドリングを行うだけの簡単なアプリケーションとなりました。
このグローアップ・アプリケーションは、毎回サンプルコードも提供していますので、「こちら」よりダウンロードして試してみてください。なお、サンプルコードに動画は含まれていませんので、別途ご用意してお試しください。このアプリケーションは最初にも説明したとおり、各回の解説した内容を追加していき、最終的に1つのアプリケーションを作成します。
■ Silverlightらしいユーザーエクスペリエンス/メディアエクスペリエンス
今回はSilverlightでよく使われるメディアとイベントに関して解説しました。次回からは描画に関する機能の解説をしていきますので、グローアップ・アプリケーションも徐々にSilverlightらしいユーザーエクスペリエンス/メディアエクスペリエンスを持ったRIAになっていきます。次回以降もぜひご期待ください。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Silverlightは次世代のJavaScriptフレームワーク?
 ついに正式リリース! いまこそ知りたい!! どの環境でも動くマイクロソフトのRIA技術Silverlightについて、実際に動く2つのサンプルを見ながら、その特徴と技術を解説
- Silverlightと株価ビジュアライゼーション
 連載:Flash観測所(2) マイクロソフト発の新動画再生技術のSilverlightと、複雑な株価データを効果的に見せるFlashアプリサービスを紹介する
- XAMLの基礎知識
 .NET Framework 3.0のWindowsアプリ構築フレームワーク「WPF」においてGUI記述を担うXAML(ザムル)。この新言語を基礎のキソから学ぶ
- ・第1回 Hello Worldとテキスト・エディタで始めるXAML
- ・第2回 XAMLとWPFの関係
- 北米で話題のFlash動画アプリケーションサービス
 連載:Flash観測所(1) 北米で話題のFlashによる動画サイト。UGC的ビデオ共有サイトの動画に付加価値を加えたり、ユーザーが編集できる話題のサービスを紹介する
- JavaScriptプログラミング再入門
 Ajax全盛のいま、オブジェクト指向ベースのJavaScript知識は不可欠。過去を振り返りつつ、まずは最新開発事情をチェック
- ・第1回 JavaScriptの復権
- ・第2回 JavaScriptの関数をマスターしよう
- ・第3回 JavaScriptにおける変数の宣言とスコープ
- ・最終回 JavaScriptでオブジェクト指向プログラミング

