エラー処理
Silverlightプラグインが実行時に何らかのエラーを発生させた場合、エラーの通知や原因の報告を行うことができます。デバッグ時にはもちろんですが、リリース後に利用者が予期しないエラーを発生させた時、エラーの報告に役立てることができるでしょう。Silverlightで発生したエラーは、onError()イベントで受け取ります。このイベントは、エラーが発生したときにSilverlightから呼び出されます。
onError(sender, errorEventArgs)
onError()イベントのハンドラは、Silverlight.createObject()メソッドの第5パラメータに渡すオブジェクトのonErrorメンバに設定します。onErrorがnull場合は、デフォルトのエラー処理が行われます。
onError()イベントを受ける関数は、senderとerrorEventArgsという2つのパラメータを受け取ることができます。senderには、イベントを発生させたSilverlight Plug-inオブジェクトが格納されています。errorEventArgsには、エラーコードやエラー型、エラーメッセージなどを格納するErrorEventArgsオブジェクトが格納されています。このオブジェクトは、直接インスタンス化して利用することはありません。onErrorイベントのハンドラのパラメータとして受け取るため、onError()イベントを呼び出すSilverlightによって自動的に生成されます。私たちは、onError()イベントのパラメータで受け取ったこのオブジェクトを利用するだけでよいのです。
ErrorEventArgsオブジェクトは、エラーの原因に関連する情報を提供します。エラーを整数で表したエラーコードはErrorCodeプロパティから取得できます。
value = eventargs.ErrorCode
ErrorCodeが返す値は、エラーの種類に対応した整数です。プログラムによるエラーの種別には便利ですが、人間が直観的に把握するには不向きです。
エラーの種類は、ErrorTypeプロパティから取得することもできます。
value = eventargs.ErrorType
ErrorTypeプロパティは、ErrorType列挙体によって宣言されているいずれかの値を返します。実際には、ErrorType列挙体によって定められている値が文字列として格納されています。例えば、XAMLの構文が間違っているような場合は"ParserError"が、画像のダウンロードに失敗した場合は"ImageError"といった文字列が返されます。
エラーの詳細は、ErrorMessageプロパティから取得できます。ErrorMessageプロパティの値は、エラーの原因を表すテキストです。
value = eventargs.ErrorMessage
エラーが何によって引き起こされたのかをErrorTypeプロパティから種別し、ErrorCodeやErrorMessageから得られる値で、具体的なエラー原因を特定できます。予期せぬエラーで利用者を混乱させないためにも、エラー処理は重要です。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Silverlight test</title> <script type="text/javascript" src="Silverlight.js"></script> <script type="text/javascript"> function onErrorHandler(sender, errorEventArgs) { var errorPanel = document.getElementById("errorPanel"); errorPanel.innerHTML = "<strong>エラーが発生しました</strong><br/>" + "エラーコード=" + errorEventArgs.ErrorCode + "<br/>" + "エラータイプ=" + errorEventArgs.ErrorType + "<br/>" + "メッセージ=" + errorEventArgs.ErrorMessage ; } </script> </head> <body> <div id="errorPanel" style="color:red;"></div> <div id="silverlight"></div> <script type="text/javascript"> var parentElement = document.getElementById("silverlight"); Silverlight.createObject( "test.xaml", //ソースファイル parentElement, //Silverlight を表示するDIVタグのDOMオブジェクト "silverlight01", //任意の一意なプラグインID { width: "400", //幅 height: "300", //高さ background: "#FFFFFF", //背景色 version: "1.0" //Silverlight のバージョン }, { onError: onErrorHandler, //エラー時のイベントハンドラ onLoad: null //読み込み時のイベントハンドラ }, null, //初期化パラメータ null //onLoad イベントに渡される値 ); </script> </body> </html>

コード03は、onErrorHandler()関数をonError()イベントとしてSilverlight.createObject()メソッドのパラメータに渡しています。その結果、このSilverlightプラグインでエラーが発生したときにonErrorHandler()関数が呼び出されます。例では、意図的に不適切なXAMLファイルを読み込ませてエラーを発生させています。onErrorHandler()関数は、ErrorEventArgsオブジェクトからエラーの種類や原因を取得し、DIVオブジェクトに表示させます。実行結果を見ると、SilverlightによってXAMLが読み込まれるとエラーが発生し、onErrorHandler()関数が呼び出されていることを確認できます。
XAMLファイルの動的な読み込み
Silverlight Plug-inオブジェクトを使うことで、さらに柔軟なプログラムを実現することも可能です。例えばSourceプロパティはSilverlightが読み込んでいるXAMLファイルそのものを表すプロパティです。このプロパティは、現在のXAMLファイルのパスを取得するだけではなく、別のXAMLファイルを設定することも可能です。このプロパティの値を変更することで、まったく別のXAMLファイルを実行時に読み込ませることができます。また、Silverlightオブジェクトの構造を初期状態に復元したい場合にも応用できます。
value = silverlightObject.Source silverlightObject.Source = value
onLoad()イベントで受け取ったオブジェクトをグローバルなスコープに保存しておいて、任意のタイミングでSourceプロパティの値を変更すれば、1つのSilverlightプラグインの中で複数のXAMLファイルの表示を切り替えることができます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Silverlight test</title> <script type="text/javascript" src="Silverlight.js"></script> <script type="text/javascript"> var silverlight; function onLoadHandler(sender, context, source) { silverlight = sender; } function onClickHandler() { var xaml = document.getElementById("xamlInput"); silverlight.Source = xaml.value; } </script> </head> <body> <div> <input type="text" id="xamlInput"></input> <input type="button" onclick="onClickHandler()" value="OK"></input> </div> <div id="silverlight"></div> <script type="text/javascript"> var parentElement = document.getElementById("silverlight"); Silverlight.createObject( "test1.xaml", //ソースファイル parentElement, //Silverlight を表示するDIVタグのDOMオブジェクト "silverlight01", //任意の一意なプラグインID { width: "400", //幅 height: "300", //高さ background: "#FFFFFF", //背景色 version: "1.0" //Silverlight のバージョン }, { onError: null, //エラー時のイベントハンドラ onLoad: onLoadHandler //読み込み時のイベントハンドラ }, "Dote up a cat.", //初期化パラメータ "Kitty on your lap" //onLoad イベントに渡される値 ); </script> </body> </html>

コード04は、デフォルトで「test1.xaml」を表示していますが、テキストボックスにXAMLファイルのアドレスを入力して[OK]ボタンを押すと、入力されたXAMLファイルを読み込むというプログラムです。テキストボックスと[OK]ボタンはHTMLフォームによって表示されています。ボタンが押されるとonClickHandler()関数が呼び出され、Sourceプロパティの値を入力された値に変更します。コード04では、同じフォルダに「test2.xaml」と「test3.xaml」を置いてあるので、テキストボックスに入力して[OK]ボタンを押してみてください。
