應用程式、資源和部署



本章將探討建立和部署應用程式及其所需資源時常見的問題。

載入外掛

執行 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**。

編譯並執行上述程式碼後,您將看到以下輸出。

XAML Resources

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 應用程式。

螢幕上的外掛區域將變為空白,並將向瀏覽器報告指令碼錯誤。

廣告
© . All rights reserved.