- Silverlight 教程
- Silverlight - 首頁
- Silverlight - 概述
- Silverlight - 環境設定
- Silverlight - 入門
- Silverlight - XAML 概述
- Silverlight - 專案型別
- Silverlight - 固定佈局
- Silverlight - 動態佈局
- 受約束與不受約束
- Silverlight - CSS
- Silverlight - 控制元件
- Silverlight - 按鈕
- Silverlight - 內容模型
- Silverlight - ListBox
- Silverlight - 模板
- Silverlight - 可視狀態
- Silverlight - 資料繫結
- Silverlight - 瀏覽器整合
- Silverlight - 瀏覽器外執行
- Silverlight - 應用程式、資源
- Silverlight - 檔案訪問
- Silverlight - 檢視模型
- Silverlight - 輸入處理
- Silverlight - 隔離儲存
- Silverlight - 文字
- Silverlight - 動畫
- Silverlight - 影片和音訊
- Silverlight - 列印
- Silverlight 有用資源
- Silverlight - 快速指南
- Silverlight - 有用資源
- Silverlight - 討論
應用程式、資源和部署
本章將探討建立和部署應用程式及其所需資源時常見的問題。
載入外掛
執行 Silverlight 應用程式的最低要求是:包含用於載入 Silverlight 外掛的物件標籤的宿主網頁,以及已編譯的 Silverlight 內容本身。
如您所見,我們在物件標籤中使用了 <param> 標籤來指向內容。
HTML <Object> 標籤
我們可以傳遞其他引數來控制一些功能,例如下載內容時顯示的使用者介面、發生錯誤時執行的 JavaScript 程式碼以及未安裝 Silverlight 時顯示的回退內容。
<Object> 在 HTML 中
這是一個載入某些 Silverlight 內容的物件標籤示例。您之前已經見過這個,但我們將更詳細地研究一些內容,首先是從物件標籤本身的屬性開始。
Type 屬性
type 屬性包含一個 MIME 型別,將其標識為 Silverlight 元素。這就是瀏覽器知道我們使用哪種嵌入式內容的方式。object 標籤非常靈活。它不僅僅用於外掛。您還可以使用它來託管嵌入式影像或 HTML,以及基於外掛的內容,例如 Silverlight 或 Flash。
如果安裝了 Silverlight 外掛,則將載入它。如果沒有,標準格式行為是瀏覽器將物件標籤內的任何 HTML 內容呈現為好像物件和 param 標籤不存在一樣。
<object data = "data:application/x-silverlight-2," type = "application/x-silverlight-2"
width = "100%" height = "100%">
<param name = "source" value = "ClientBin/DataBinding.xap"/>
<param name = "onError" value = "onSilverlightError" />
<param name = "background" value = "white" />
<param name = "minRuntimeVersion" value = "5.0.61118.0" />
<param name = "autoUpgrade" value = "true" />
<a href = "http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0"
style = "textdecoration:none">
<img src = "http://go.microsoft.com/fwlink/?LinkId=161376"
alt = "Get Microsoft Silverlight" style = "border-style:none"/>
</a>
</object>
Data 屬性
下一個屬性 data 就沒那麼明顯了。末尾的逗號應該放在那裡。一些重要的功能是:
從技術上講,此屬性並非必需,但 Microsoft 建議您新增它,因為某些 Web 瀏覽器的載入外掛行為相當令人意外。
**object 標籤**旨在託管嵌入式內容,因此瀏覽器期望包含二進位制字串、點陣圖檔案或影片或音訊流等。
您通常會期望在 data 屬性中放置一個 URL,瀏覽器下載該資料並將其傳遞給外掛。
data 屬性採用 URI,通常它會指向某些資料,例如 JPEG 檔案,但在這裡,我們使用的是稍微不同尋常的 URI 方案。
<param> 標籤
我們在 object 內有各種 <param> 標籤,從 source <param> 開始。
<param name = "source" value = "ClientBin/DataBinding.xap"/>
它告訴外掛從哪裡下載 Silverlight 內容。
您應該提供一個 JavaScript 錯誤處理程式。如果下載過程失敗,將呼叫它。如果丟擲未處理的異常,一旦 Silverlight 程式碼啟動並執行,也將呼叫它。
<param name = "onError" value = "onSilverlightError" />
所以它不僅僅用於載入失敗。您還應該指定程式碼所需的 Silverlight 最小版本。
Microsoft 鼓勵使用者保持最新狀態,因此一旦機器安裝了 Silverlight 外掛,新版本將透過 Windows 更新提供,但使用者執行的版本可能始終比您需要的版本舊。
<param name = "minRuntimeVersion" value = "5.0.61118.0" /> <param name = "autoUpgrade" value = "true" />
此 **minRuntimeVersion** 引數允許您指定所需的版本。如果安裝的版本較舊,則將呼叫 onError 處理程式。
Silverlight 將數字錯誤程式碼傳遞給錯誤處理 JavaScript 函式,並且有一個獨特的錯誤程式碼“**8001**”(碰巧如此),表示外掛已過期。
您可以編寫 JavaScript 程式碼來響應問題,或者您可以只要求外掛嘗試為您進行升級。
在這裡,**autoUpgrade** 引數設定為“**True**”,這意味著如果安裝的外掛已過期,Silverlight 將自動顯示一條訊息,告訴使用者需要較新版本,並主動提供安裝。
回退 HTML 內容
在 param 標籤之後,是如果未安裝 Silverlight 將使用的**回退 HTML 內容**。
對於 MIME 型別未知的物件標籤,標準瀏覽器行為是將其視為物件和 param 標籤根本不存在。因此,如果沒有 Silverlight 外掛,將顯示此標籤及其內容。
<a href = "http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0"
style = "text-decoration:none">
<img src = "http://go.microsoft.com/fwlink/?LinkId=161376"
alt = "Get Microsoft Silverlight" style = "border-style:none"/>
</a>
請注意指向 **go.microsoft.com** 站點的兩個 URL,一個超連結和一個影像。
影像連結解析為帶有某些 Silverlight 品牌和提供安裝 Silverlight 的一些文字的點陣圖。超連結的端點相當智慧。伺服器檢查使用者代理以決定重定向位置。
它可能會返回 Silverlight 安裝可執行檔案,或者如果使用者在不受支援的平臺上,它會將瀏覽器定向到包含有關 Silverlight 的資訊的頁面。
Silverlight.js
載入 Silverlight 內容的另一種方法是替代 HTML 物件標籤。Microsoft 提供了一個名為 **Silverlight.js** 的 JavaScript 檔案,允許從瀏覽器指令碼管理載入過程。
建立用於託管新建立的 Silverlight 專案的 Web 專案時,Visual Studio 會新增一個副本。Silverlight SDK 還包含此檔案的副本。
**Silverlight.js** 的主要優點是它在未安裝 Silverlight 時允許更大的靈活性。
XAML 資源
Silverlight 還提供了一種在 XAML 中建立**物件資源**的機制。某些型別的物件通常透過 XAML 校正,您可能希望能夠在應用程式中的多個位置使用它們。在多個位置使用模板是很常見的。
如果您為按鈕定義了自定義外觀,您可能希望將其應用於多個按鈕,甚至可能應用於應用程式中的所有按鈕。XAML 資源系統提供了一種方法來實現此目的。您可以定義一個**命名資源**,然後在 XAML 中其他地方使用它。
除了模板之外,對於圖形資源(例如畫筆和形狀)也經常需要這樣做。如果您的應用程式中使用了特定的配色方案,您可以將該方案的顏色和畫筆定義為資源。
這是一個用於**SolidColorBrush**資源的簡單應用程式。
<UserControl x:Class = "XAMLResources.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<UserControl.Resources>
<SolidColorBrush x:Key = "brushResource" Color = "AliceBlue" />
</UserControl.Resources>
<Grid x:Name = "LayoutRoot" Background = "White">
<StackPanel>
<Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}" />
<Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}"/>
</StackPanel>
</Grid>
</UserControl>
在上面的 XAML 程式碼中,您可以看到兩個矩形都有**StaticResource** **brushResource**的顏色是**AliceBlue**。
編譯並執行上述程式碼後,您將看到以下輸出。
App.xaml
所有 Silverlight 應用程式都有一個名為 **App.xaml** 的檔案。它包含應用程式範圍的資訊。例如,它具有與使用者介面元素相同的 Resources 屬性。
在 **App.xaml** 檔案中定義的資源可在專案中的所有 XAML 檔案中使用。因此,與其使用這些型別的資源來弄亂我的 **MainPage.xaml**,我們可以將其移至應用程式範圍。
<Application
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
x:Class = "XAMLResources.App" >
<Application.Resources>
<SolidColorBrush x:Key = "brushResource" Color = "AliceBlue" />
</Application.Resources>
</Application>
Application 類
與大多數 XAML 檔案一樣,**App.xaml** 檔案及其對應的**程式碼隱藏**檔案定義一個類。此 Application 類是 Silverlight 應用程式的入口點。**App.xaml** 通常處理應用程式範圍的資源;其程式碼隱藏檔案包含啟動和關閉處理程式碼。
在建立 Application 類的例項後不久,Silverlight 將引發其 **Application.Startup** 事件。
在這裡,我們建立使用者介面。我們期望建立一個使用者介面元素並將其分配給應用程式物件的 RootVisual 屬性在 **Startup** 事件中,這將成為 Silverlight 外掛顯示的使用者介面。
public partial class App : Application {
public App() {
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}
private void Application_Startup(object sender, StartupEventArgs e) {
this.RootVisual = new MainPage();
}
private void Application_Exit(object sender, EventArgs e) {}
private void Application_UnhandledException(object sender,
ApplicationUnhandledExceptionEventArgs e) {
if (!System.Diagnostics.Debugger.IsAttached) {
e.Handled = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
}
}
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e) {
try {
string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
System.Windows.Browser.HtmlPage.Window.Eval("throw new Error
(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
} catch (Exception) {}
}
}
需要注意的事項
請注意,您無法更改 **RootVisual**。您必須只設置一次。如果您想在應用程式執行時更改使用者介面,則必須透過更改 **MainPage** 的內容來實現,而不是嘗試用不同的內容替換 **MainPage**。
其他應用程式事件是 **Exit**(當用戶介面即將消失時,這是執行關閉程式碼的最後機會)和 **UnhandledException**(如果您的程式碼丟擲未處理的異常,則會引發此事件)。
如果您未提供 **UnhandledException** 事件的處理程式,或者該處理程式未將事件標記為已處理,則 **UnhandledExceptions** 將有效地關閉您的 Silverlight 應用程式。
螢幕上的外掛區域將變為空白,並將向瀏覽器報告指令碼錯誤。