有時候會遇到一些XAML代碼解析錯誤,比如當XAML代碼出現錯誤時,還是能夠通過編輯,但是在解析該XAML代碼時會彈出一些奇怪的錯誤提示,如圖11.13所示。
圖11.13 XAML解析錯誤
由上圖可以發現,這是一個JavaScript應用程序錯誤,在HTML文件的後置JavaScript文件中,createSilverlight方法用於創建Silverlight插件,該方法提供了一個OnError事件,可以處理Silverlgiht解析錯誤、運行時錯誤以及其他類型的錯誤。
爲了定義這個事件,首先打開TestPage.html.js文件,爲CreateSilverlight函數添加OnError事件,代碼如下所示。
//contains calls to silverlight.js, example below loads Page.xaml
function createSilverlight()
{
Silverlight.createObjectEx({
source: "Page.xaml",
parentElement: document.getElementById("SilverlightControlHost"),
id: "SilverlightControl",
properties: {
width: "100%",
height: "100%",
version: "1.1",
enableHtmlAccess: "true"
},
//添加一個處理錯誤的事件處理代碼,注意在Silverlight1.1中,這個事件處理名稱不能是字符串。
//否則瀏覽器會提示一個JavaScript錯誤
events: {onError:OnErrorEventHandler} // Set the onError handler.
});
// Give the keyboard focus to the Silverlight control by default
document.body.onload = function() {
var silverlightControl = document.getElementById('SilverlightControl');
if (silverlightControl)
silverlightControl.focus();
}
}
代碼在events中定義了onError事件,與Silverlight 1.0不同的是,這裏的事件處理函數名稱不應該是一個字符串。否則瀏覽器會提示錯誤。
接下來定義OnErrorEventHandler的事件處理代碼,如下所示。
function OnErrorEventHandler(sender, errorArgs)
{
// 顯示錯誤消息
var errorMsg = "Silverlight Error: /n/n";
errorMsg += "Common Error Info:/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);
}
現在運行程序,則會彈出剛纔所定義的錯誤窗口,如圖11.14所示。
圖11.14 定製的錯誤提示
同樣,讀者也可以發揮想象力來訂製錯誤的提示,一個問題是不支持中文,希望在Silverlight的後續版本中能夠得到改進。