実際にイベントを使用する際は、先に紹介した<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つの方法があります。
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イベントを使用します。
表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らしいユーザーエクスペリエンス/メディアエクスペリエンスを持ったRIAになっていきます。次回以降もぜひご期待ください。
Copyright © ITmedia, Inc. All Rights Reserved.