第 1 章:「Longhorn」 應用程式模型

 

簡介

第 1 章:「Longhorn」 應用程式模型

Brent Rector
明智的 Owl 諮詢

2003 年 10 月

目錄

「Longhorn」 應用程式模型的功能
Application 類別
NavigationApplication 類別
Extensible Application Markup Language (XAML)
總結

為什麼我們需要新的應用程式模型? 其中一個主要原因是要橋接開發 Microsoft® Windows® 應用程式與開發 Web 應用程式之間的差距。

現在當您撰寫 Windows 應用程式時,您可以利用 Windows 功能。 您的應用程式可以提供豐富的回應式使用者介面。 您可以在用戶端電腦上安裝應用程式,讓應用程式在沒有網路連線的情況下離線執行。 Windows 應用程式可以利用用戶端電腦的硬體功能。

不過,傳統 Windows 應用程式也有一些缺點。 您通常必須安裝 Windows 應用程式。 這可讓應用程式和任何更新難以部署。 Windows 應用程式不會在瀏覽器中執行。 因此,熟悉的 Web UI 範例,例如頁面導向應用程式、直接從一個頁面流覽到另一個頁面、頁面歷程記錄等等,除非您從頭開始建立它們。 Windows 應用程式也不支援非常妥善的文字,特別是當您嘗試在相同頁面上混合文字和圖形時。 建立 Windows 應用程式,以自動在圖形周圍流動文字,並回應視窗大小和使用者喜好設定中的字型和可讀性變更,是大量的工作。

Web 應用程式也有自己的相異優勢。 當您流覽至網頁時,瀏覽器只會下載該頁面,以及頁面所需的元件。 當您流覽至新頁面時,瀏覽器會下載新頁面的需求。 換句話說,瀏覽器會視需要逐漸下載應用程式。

Web 應用程式的部署很簡單。 哪個部署? 您會在伺服器上放置必要的應用程式元件,而且瀏覽器會視需要下載它們。 沒有個別的部署。

建立 Web 應用程式的 UI 也相當容易。 您可以使用標記來宣告您的意圖。 例如,假設我想要特定位置的資料表。 我想要讓影像追蹤資料表。 我想要讓一些文字在影像周圍流動。 在 Web 應用程式中混合文字、圖形和媒體 (音效和視訊) 很簡單。

當然,Web 應用程式也有其不良點。 您無法在桌面系統上安裝 Web 應用程式;因此,應用程式無法離線執行。 您必須一律有伺服器的連線。 某些應用程式作業需要往返伺服器,且可降低效能。 相較于可用的 Windows 控制項,Web 應用程式選取控制項相當基本。 因此,Web 應用程式通常具有不良的互動性。 您也很難為 Web 應用程式開發吸引人的 UI,因為您必須使用資料表來表達任何非簡單的版面配置。

目前,設計新應用程式的開發人員必須做出初始、大型、無法復原的決策:應用程式是否為 Web 樣式應用程式或傳統 Microsoft Win32® 應用程式? 視您選擇的應用程式模型而定,需要完全分隔程式設計模型 (和技能!) 。

「Longhorn」 可讓您使用兩個世界的最佳應用程式來開發應用程式。 「Longhorn」 應用程式模型採用 Web 應用程式的最佳功能,以及 Windows 應用程式的最佳功能,並根據 Managed 程式碼將它們結合在單一整合的程式設計模型中。

開發新應用程式模型的第二個主要原因是提供單一程式設計模型,可在現今使用中建立各種不同的「應用程式」。 查看您最愛的其中一個網站,例如 CNN 或 MSNBC。 網站是否為傳統應用程式? 它是檔嗎? 這是多媒體簡報嗎? 在許多情況下,這三個問題的答案都是是的。

當網站包含 UI 元素,例如清單方塊、編輯控制項和選項按鈕時,看起來就像呈現 UI 的應用程式。 不過,當它顯示影像和文字在影像周圍流動時,網站會類似于檔。 當它呈現 Flash 內容、圖形、音訊、視訊和動畫時,網站似乎是多媒體簡報。

當然,這類豐富的網站很難開發。 您必須修補網頁的 HTML 標籤型描述,以及適用于豐富 UI 的 Microsoft ActiveX® 控制項、內嵌的 Flash 動畫,以及可能針對檔支援使用可攜式檔案格式 (PDF) 。 所有這些技術都會使用不同的架構、提供不同的效能特性,而且需要不同的程式設計模型和工具。

這通常表示您必須雇用具有不同技能集的多個開發人員,才能開發應用程式的每個部分。 然後,開發人員必須將不同的模型合併成單一工作應用程式。 開發應用程式已足夠困難。 偵錯通常是一個夜鐺。

「Longhorn」 提供統一的架構,可支援這三層:檔、應用程式和媒體。 您要使用標記以宣告方式建立 UI 嗎? 請移至它。 您需要使用豐富的 Windows 控制項嗎? 然後執行這項操作! 您要以強型別的 Managed 語言撰寫事件處理常式嗎? 您也可以這麼做。 您是否要根據使用者的喜好設定,將檔中的文字、圖形和視訊與視訊混合在一起,並根據使用者的喜好設定進行優化,以在用戶端系統上進行最佳檢視和閱讀? 但您知道嗎? 您也會得到。

「Longhorn」 應用程式模型可讓您使用支援應用樣式 UI 功能、文字和圖形的檔樣式呈現,以及各種媒體整合的單一程式設計模型來撰寫應用程式。 此外,您可以使用 Web 應用程式之類的標記來建立 UI。 您也可以取得部署 (或缺乏部署) 輕鬆的 Web 應用程式。 不過,您仍然能夠安裝應用程式以供離線使用,例如 Windows 應用程式。 您的應用程式可以直接重新編譯一個原始程式碼基底,以獨立應用程式的形式執行,或裝載于網頁瀏覽器中。 不論是哪一種情況,您的應用程式都可以以表單為基礎,例如許多傳統 Windows 應用程式,或以頁面為基礎的應用程式,例如 Web 應用程式。

「Longhorn」 應用程式模型的功能

「Longhorn」 應用程式模型會定義應用程式是什麼:

  • 其進入點
  • 其控制流程— 如何從一個頁面流覽到另一個頁面
  • 其共用狀態和資源
  • 全應用程式事件
  • 與其他應用程式的隔離

「Longhorn」 應用程式模型會定義如何部署和維護應用程式:

  • 部署為單一或多個檔案
  • 更新、復原和管理

「Longhorn」 應用程式模型會定義應用程式的使用者體驗:

  • 零影響安裝
  • 獨立 (Windows 樣式) 或整合在瀏覽器中
  • 在線上或離線執行
  • 巡覽模式

「Longhorn」 Web 應用程式

「Longhorn」 應用程式模型可讓您撰寫豐富的應用程式,類似于您撰寫現今 Web 應用程式的方式。 這為 Web 開發人員提供簡單的移轉路徑,因為它們撰寫的程式碼類似于動態 HTML (DHTML) 網頁的程式碼。 他們可以 (shuder) 在同一個檔案中放置標記和腳本。 他們可以將應用程式的檔案部署到 Web 服務器。 應用程式頁面會在網頁瀏覽器中執行。

不過,「Longhorn」 Web 樣式應用程式的物件模型比 DHTML 更簡單且更強大。 應用程式程式碼可以使用完整的 「Longhorn」 呈現層。 因此,「Longhorn」 Web 應用程式可以使用豐富的用戶端控制項、支援頁面上的多媒體和圖形、在本機處理事件,基本上是一般用戶端應用程式可能會執行的一切。 事實上,「Longhorn」 Web 應用程式與 「Longhorn」 桌面應用程式不同,而不是伺服器上的檔案;瀏覽器通常但不一定裝載 UI;應用程式會以受限制的許可權執行,因為使用者尚未將它安裝在用戶端系統上。

「Longhorn」 桌面應用程式

「Longhorn」 應用程式模型也會定義如何撰寫傳統型應用程式。 「Longhorn」傳統型應用程式是使用者已在本機安裝的應用程式。 這類應用程式可以在線上或離線執行。 這類應用程式可以向殼層註冊、將圖示放在桌面上、將快捷方式新增至 [開始] 功能表等等。

傳統型應用程式也可以在瀏覽器視窗或獨立視窗中執行。 事實上,傳統型應用程式可以支援許多與 Web 應用程式相關聯的功能,包括下列各項:

  • 明確定義外部進入點,也就是可以在任何頁面上開始
  • 跨頁面共用狀態
  • 處理各種事件,包括頁面導覽事件
  • 控制應用程式流程
  • 從頁面歷程記錄/移動導覽記錄新增/移除專案
  • 啟動應用程式視窗

建置 「Longhorn」 應用程式

若要建置 「Longhorn」 應用程式,您可以定義應用程式的物件模型。 您可以使用稱為 Extensible Application Markup Language 的語言撰寫標記,以宣告方式撰寫程式碼,以程式設計方式定義模型 (XAML) 。 您可以將程式碼和/或標記編譯成一或多個 .NET 元件、應用程式資訊清單檔和部署資訊清單檔。

您可以選擇性地將應用程式封裝成稱為 容器的新檔案格式。 容器中的應用程式檔可以壓縮、加密及數位簽署。

我在第 2 章中詳細討論如何建置 「Longhorn」 應用程式,但目前主要概念是建置 「Longhorn」 應用程式提供您應用程式的程式碼、描述應用程式使用之所有元件的應用程式資訊清單,以及告知系統如何安裝和維護應用程式的部署資訊清單。

部署 「Longhorn」 應用程式

「Longhorn」 應用程式模型可讓您輕鬆且符合成本效益地部署應用程式。 在最簡單的情況下,您只需將應用程式檔案複製到伺服器。 同樣地,安裝您的應用程式相當簡單且不具影響力。

一個選項完全不安裝應用程式。 使用者可以流覽至伺服器上的應用程式資訊清單,並加以執行。 「Longhorn」 會以累加方式下載您的應用程式並加以執行。 您不會收到任何確認要求、沒有重新開機需求,也不會收到 DLL。 事實上,您甚至不需要系統管理員許可權才能安裝或執行應用程式。

或者,使用者可以流覽至伺服器上的應用程式部署資訊清單,並加以執行。 「Longhorn」 會以累加方式下載您的應用程式、安裝並執行它。 根據預設,所有 「Longhorn」 應用程式都會在稱為「安全執行環境」的有限許可權環境中執行, (SEE) 。

在 SEE 中執行的應用程式會收到限制的許可權集,大致相當於授與與網際網路區域目前應用程式的許可權。 預設需要 「Longhorn」 所提供額外許可權的應用程式,必須在其應用程式資訊清單中要求這些額外的許可權。

使用者第一次執行這類應用程式時,「Longhorn」 信任管理員會評估提高的許可權要求、通知使用者與授與應用程式許可權要求相關聯的建議風險層級,並為該風險層級提供建議的回應。 當使用者允許信任管理員授與應用程式要求的許可權時,信任管理員會記錄這項資訊。 後續執行已安裝的應用程式會繼續執行,而不會有安全性警告。

現在,當您在本機安裝應用程式時,它只會收到 FullTrust 許可權集合,因為它會從 LocalComputer 區域載入。 程式碼存取安全性 (CAS) 對於 「Longhorn」 應用程式的運作方式不同。 本機 (或安裝) 應用程式會在使用者下載該月臺的安全性原則下執行,而不只是因為安裝在本機而自動接收 FullTrust。

載入應用程式、其元件及其資源時,「Longhorn」 會提供 Common Language Runtime (CLR) 安全性系統的辨識項,例如

  • 來自統一資源識別元 [URI]) 的網際網路區域和來源網站 (
  • 從部署資訊清單 (發行者和模組名稱)

CAS 接著會根據應用程式的辨識項,提供安全性原則式強制執行存取許可權。

應用程式的部署資訊清單可以指定檢查新版應用程式時,「Longhorn」 應該使用的更新間隔。 當 「Longhorn」 偵測到有新版本可用時,它會在背景下載並安裝新版本。 下次使用者執行應用程式時,她會收到新版本。

安裝應用程式時,如果有的話,「Longhorn」 會保留舊版。 如果您需要,您可以輕鬆回復至舊版,或甚至使用新增/移除程式完全卸載應用程式。 IT 部門可以將應用程式安裝推送至用戶端系統,以進行免操作部署。

您可以在編譯專案時指定如何部署應用程式,而且您可以藉由重新編譯來變更部署案例,通常只有少數或沒有原始程式碼的變更。

開發人員的程式一開始會透過 MSAvalon.Windows.Application 類別的實例與大部分的 「Longhorn」 應用程式支援互動,因此讓我們看看該類別。

應用程式類別

「Longhorn」 程式一律包含應用程式物件的單一實例。 此物件直接或間接衍生自 MSAvalon.Windows.Application 類別,並執行下列函式:

  • 提供應用程式的進入點、封裝和範圍
  • 允許應用程式跨組成應用程式的頁面共用程式碼和狀態
  • 提供應用層級事件
  • 維護應用程式的視窗集合
  • 提供安全性模型
  • 定義應用程式使用的任何資源

MSAvalon.Windows.Application類別提供應用程式的基本應用程式支援。 當您的應用程式需要低負荷,且不使用頁面流覽功能時,通常會使用它。 不過,大部分的 「Longhorn」 平臺應用程式都會使用緊密相關的 MSAvalon.Windows.NavigationApplication 類別,其繼承自 MSAvalon.Windows.Application ,並新增流覽的支援。 我們將在下一節中詳細討論 NavigationApplication 類別。 您通常會定義繼承適當基類的類別、視需要覆寫基類方法,然後註冊事件以提供自訂啟動或關機程式。

此處顯示的 SimpleApplication1.cs 原始程式檔清單示範如何使用 Application 物件。 EntryClass.Main方法會建立我的特製化應用程式物件MyApp,並呼叫其Run方法來啟動應用程式。 MyApp類別會覆寫OnStartingUp方法,這個方法會在應用程式啟動時接收控制項。 當系統叫用 OnStartingUp 方法時,我呼叫可建立應用程式主視窗的協助程式方法、將一些文字新增至視窗,並顯示視窗。

SimpleApplication1.cs

using System;
using MSAvalon.Windows;
using MSAvalon.Windows.Controls;
using MSAvalon.Windows.Media;

namespace IntroLonghorn {
  public class MyApp : MSAvalon.Windows.Application {
    MSAvalon.Windows.Controls.SimpleText txtElement;
    MSAvalon.Windows.Window              mainWindow;

    protected override void OnStartingUp (StartingUpCancelEventArgs e) {
      base.OnStartingUp (e);
      CreateAndShowMainWindow ();
    }

    private void CreateAndShowMainWindow () {
      // Create the application's main window
      mainWindow = new MSAvalon.Windows.Window ();

      // Add a dark red, 14 point, "Hello World!" text element
      txtElement = new MSAvalon.Windows.Controls.SimpleText ();
      txtElement.Text = "Hello World!";
      txtElement.Foreground = new
       MSAvalon.Windows.Media.SolidColorBrush (Colors.DarkRed);
      txtElement.FontSize = new FontSize (14, 
                                          FontSizeType.Point);
      mainWindow.Children.Add (txtElement);
      mainWindow.Show ();
    }
  }

  internal sealed class EntryClass {
    [System.STAThread]
    private static void Main () {
      MyApp app = new MyApp ();

      app.Run ();
    }
  }
}

我使用下列命令列,將 SimpleApplication1.cs 原始程式碼編譯為可執行檔應用程式。 您可能需要調整參考元件的路徑。

csc /r:C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030\PresentationCore.dll
    /r:C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030\PresentationFramework.dll
    /r:C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030\WindowsBase.dll
    SimpleApplication1.cs

Application類別包含一些其他有用的屬性、方法和事件。 例如,您的應用程式類別可以覆寫 OnShuttingDown 虛擬方法,以提供自訂關機行為。 應用程式類別也提供 StartingUpShutdowntingDown 事件,讓其他類別可以註冊啟動和關機通知。 Shutdown方法可讓您以程式設計方式起始應用程式的關機。

您可能想要從原始程式碼中的多個位置參考應用程式物件。 因此, Application 類別會提供 Current 靜態屬性,以傳回應用程式物件的參考。 下列程式碼片段會使用 Current 屬性來尋找應用程式物件,並註冊關機事件通知:

MyApp app = (MyApp) MSAvalon.Windows.Application.Current;
  app.ShuttingDown += new
       Application.ShuttingDownEventHandler (ShutDownHandler);
§
private static void
 ShutDownHandler (object sender, MSAvalon.Windows.ShuttingDownEventArgs e) {
§
}

NavigationApplication類別

當您想要為應用程式提供導覽支援時,您通常會使用 MSAvalon.Windows.Navigation.NavigationApplication 類別,這會擴充 MSAvalon.Windows.Application 類別。 雖然您可以在不使用 NavigationApplication 類別的情況下建置導覽型應用程式,但使用 類別可為您的應用程式提供下列額外功能:

  • 簡化撰寫導覽型應用程式;通常不需要子類別類別
  • 判斷連線何時可用
  • 提供導覽事件,例如 NavigateNavigationProcessNavigatedNavigationErrorLoadCompletedStopped,它會在應用程式的任何視窗中發生適當的事件時引發
  • 跨頁面共用狀態
  • 提供跨頁面共用屬性值的容器
  • 實作預設開啟初始視窗的原則

在外部,流覽應用程式的使用者只能巡覽至定義完善的應用程式進入點。 不過,在內部,開發人員會透過連結事件控制流覽。 您可以判斷視窗或框架何時嘗試流覽至新的頁面,以及流覽完成的時間。 您可以取消或重新導向任何導覽。 您可以找出目標頁面的身分識別。 您可以處理導覽錯誤。

熟悉的流覽模型可讓應用程式輕鬆使用。 導覽應用程式提供類似 Web 的行為。 您的應用程式可以使用超連結、提供 [轉寄] 和 [上一頁] 按鈕、顯示 [我的最愛] 清單,以及維護頁面 [歷程記錄]。 「Longhorn」 NavigationApplication 類別和相關類別提供這類功能的所有支援。

巡覽應用程式適用于線上或離線,而且無論瀏覽器裝載應用程式還是應用程式是以獨立方式執行,都一樣。 此外,您可以完全控制此 Weblike 行為。 您可以視需要自訂使用者體驗。 您可以插入、移除及修改 Travelog 專案,以控制 Forward 和 Back 作業的移動位置。 您可以在 [歷程記錄] 中定義 (進入點) 哪些頁面。

流覽應用程式通常會建立一或多個 MSAvalon.Windows.Navigation.NavigationWindow 類別的實例。 這裡顯示的 SimpleApplication2.cs 清單示範如何使用這些類別。 此清單與 SimpleApplication1.cs 相同,不同之處在于它會使用 NavigationApplicationNavigationWindow 類別。

SimpleApplication2.cs

using System;
using MSAvalon.Windows;
using MSAvalon.Windows.Controls;
using MSAvalon.Windows.Media;
using MSAvalon.Windows.Navigation;

namespace IntroLonghorn {
  public class MyApp : MSAvalon.Windows.Navigation.NavigationApplication {

    protected override void OnStartingUp (StartingUpCancelEventArgs e) {
      base.OnStartingUp (e);
      CreateAndShowMainWindow ();
    }

    private void CreateAndShowMainWindow () {

      // Create the application's main window
      mainWindow = new MSAvalon.Windows.Navigation.NavigationWindow ();

      // Fill window with appropriate controls
      §
      // Show the window
      mainWindow.Show ();
    }
  }

  internal sealed class EntryClass {
    [System.STAThread]
    private static void Main () {
      MyApp app = new MyApp ();
      app.Run ();
    }
  }
}

您目前所看到的程式碼只是傳統程式設計模型的另一種變化。 唯一的新層面是我所使用的實體類別。 不過,大部分時候,您實際上不會撰寫大部分的程式碼。 讓我們稍微瞭解一下,並瞭解新的程式設計語言,可讓您以更精簡的方式撰寫相同的程式碼,以及至少更瞭解的方式。

Extensible Application Markup Language (XAML)

在許多應用程式中,您撰寫的大部分程式碼都與建立和更新應用程式的 UI 有關。 事實上,在先前的範例中,沒有建立 UI 所需的程式碼。 在過去數年,許多開發人員已瞭解如何撰寫,甚至想要使用數種可用的標記語言之一來定義應用程式的 UI。 「Longhorn」 平臺會定義名為 Extensible Application Markup Language (XAML 的新標記語言;發音為 「Zamel」,其 rhymes 與 「camel」) 。

使用標記語言來定義 UI 有一些優點,優於使用程式設計語言。 這些優點包括:

  • 更明顯的控制階層
  • 更明顯的屬性繼承
  • 透過工具更輕鬆地處理和解譯標記語言
  • UI 和程式性程式碼的潛在區隔

我喜歡 XAML,而我偏好使用它來定義我的 UI,而不是使用我到目前為止所示範的程式類型編碼。 不過,別認為您將能夠使用 XAML,執行您所需的一切。

請考慮檔中的這個語句:「檔通常可以完全以 XAML 撰寫,並在瀏覽器中顯示。」我已提示此句子使用,而非應用程式,而且通常會使用字詞來限定語句。 當您撰寫顯示靜態內容的檔時,您可以在純 XAML 中建立它。 您甚至可以撰寫使用資料系結來顯示和更新資料來源內容的檔,但不包含 XAML。 您可以使用 XAML 而非 XAML 來定義動畫和滑鼠停留效果。 您可以使用 XAML,執行許多工作。 (事實上,我嘗試盡可能在 XAML 中執行,並在程式碼中盡可能盡可能執行。我的應用程式似乎較不有錯誤,且工作速度越少!) 不過,若要撰寫生產應用程式,您通常需要回應事件、提供自訂決策邏輯,或包含許多其他非 UI 作業,因此您必須混合 XAML 和程式碼。 幸運的是,這非常簡單。

我在第 3 章中將更深入地描述 XAML 檔案;現在,讓我們看看 XAML 的入門:

  • XAML 元素名稱是.NET Framework類別名稱。 當您定義 XAML 元素時,您會有效地建立與 XAML 元素同名的 .NET Framework 類別實例。
  • XAML 屬性名稱會對應至具有相同名稱的屬性或欄位,通常是在類別實例中。

在 SimpleApplication1.cs 程式中,我建立視窗,並使用下列程式碼將一些控制項新增至其中:

// Create the application's main window
mainWindow = new MSAvalon.Windows.Window ();

// Add a dark red, 14 point, "Hello World!" text element
txtElement = new MSAvalon.Windows.Controls.SimpleText ();
txtElement.Text = "Hello World!";
txtElement.Foreground = new 
           MSAvalon.Windows.Media.SolidColorBrush (Colors.DarkRed);
txtElement.FontSize = new FontSize (14, FontSizeType.Point);
mainWindow.Children.Add (txtElement);
mainWindow.Show ();

下列 XAML 檔會產生完全相同的 UI。

HelloWorld.xaml

<Window xmlns="https://schemas.microsoft.com/2003/xaml" Visible="true">
    <SimpleText Foreground="DarkRed" FontSize="14">Hello World!</SimpleText>
</Window>

Window 元素會建立名為 MSAvalon.Windows.Window的類別實例。 不過,建置系統必須知道名為 Window 的 XAML 元素是指名為 MSAvalon.Windows.Window的類別實例。 xmlns屬性值會提供此對應。

XML 剖析器會解譯與最近、範圍內、預設命名空間屬性、 xmlns中指定的命名空間相對不合格的專案名稱。 當您指定 「;」https://schemas.microsoft.com/2003/xaml"xmlns值時,建置系統會解譯定義專案或其其中一個次級元素上的不限定專案名稱,做為預先定義之命名空間集合中的類別名稱。

讓我們以更具體的方式重新說明,使用 C# 作為範例。 xmlns宣告實際上會將一些using語句新增至您的程式碼。 然後,建置系統會將每個不合格的 XAML 元素名稱解譯為類別名稱,並使用 提供 可能命名空間內容的 宣告。 雖然清單可能會變更,但在撰寫本文時,指定預設命名空間屬性的標準值會導致包含下列 using 語句:

using MSAvalon.Windows;
using MSAvalon.Windows.Controls;
using MSAvalon.Windows.Controls.Primitives;
using MSAvalon.Windows.Data;
using MSAvalon.Windows.Documents;
using MSAvalon.Windows.Shapes;
using MSAvalon.Windows.Media;
using MSAvalon.Windows.Media.Animation;
using MSAvalon.Windows.Navigation;

標準預設命名空間宣告也會讓建置系統參考 PresentationFrameworkPresentationCore 元件,其中包含先前所列命名空間中的類別。

我將Window元素的Visible屬性設定為true。 這會對應至透過呼叫視窗 Show 方法來顯示視窗的原始程式碼。

我已在Window元素定義中巢狀化SimpleText元素。 這會告訴系統具現化MSAvalon.Windows.Controls.SimpleText物件,使其成為Window物件的子系,並將簡單文字物件的值設定為 「Hello World!」字串。

將上述 XAML 程式碼儲存在名為 HelloWorld.xaml 的檔案中,然後執行檔案。 瀏覽器會解譯檔案中的 XAML 程式碼並顯示 UI,如圖 1-1 所示。

按一下這裡以查看較大的影像

圖 1-1。 顯示 XAML 版本的瀏覽器Hello World (按一下圖片以查看較大的影像)

您可能想要使用先前所列其中一個預設命名空間中未定義的 .NET 類別。 典型的範例是使用您建立之元件中的類別。 建置系統必須能夠將 XAML 原始程式檔中指定的專案名稱對應至正確元件中的適當 .NET 類別。 XAML 定義名為 的 XML 處理指示 (PI) 您用來建立此關聯的對應。

?對應PI 可讓您定義對應至 CLR 命名空間和元件的 XML 命名空間前置詞。 當您使用這個命名空間前置詞限定 XAML 元素名稱時,您會告訴建置系統,以取得元素名稱、將 CLR 前置詞新增至名稱,以及建立具有結果名稱之類別的實例。 編譯器會參考指定的元件,以便找到 類別的定義。

下列範例會建立 WiseOwl.Statistics.PoissonDeviate 類別的實例,其定義位於 WiseOwl.Statistics.Library 元件中:

<?Mapping XmlNamespace="stat" ClrNamespace="WiseOwl.Statistics"
                              Assembly="WiseOwl.Statistics.Library" ?>
<Window xmlns="https://schemas.microsoft.com/2003/xaml" Visible="true">
    <SimpleText Foreground="DarkRed" FontSize="14">Hello World!</SimpleText>
    <stat:PoissonDeviate Mean="5.0" />
</Window>

我無法強調 XAML 只是另一種產生使用.NET Framework UI 類別的程式碼的方式。 事實上,您可以使用視覺化設計工具,以圖形方式顯示 XAML UI 規格。 另一個工具可能會進行反向操作,並可讓您以圖形方式設計 UI,並將它儲存為 XAML 檔案。 另一個工具可能會將 UI 設計儲存為程式碼,這類似于 WinForms 設計工具的運作方式。 所有這些方法只是指定相同資訊的不同方法。

稍早在本章中,我提到瀏覽器可以在其視窗中轉譯 XAML 檔案。 只有當 XAML 檔案不包含標記,就像剛才顯示的簡單範例一樣,瀏覽器才能執行這項操作。 當您的 UI 變得更複雜時,除了描述 UI 的 XAML 之外,您通常也必須使用事件處理常式和其他非標記原始程式碼。 每當您有混合的原始程式碼基底,也就是標記和非標記原始程式碼時,都必須使用 MSBuild 公用程式編譯標記和原始程式碼。 編譯之後,您可以將應用程式當做獨立元件執行,或讓瀏覽器顯示產生的 UI。

總結

好! 您現在瞭解新應用程式模型的基本概念。 您已瞭解如何使用標記,以宣告方式建立 UI,但不是非常簡單的 UI。 您可以使用 XAML 檔案撰寫網頁的對等專案,並將這些檔案部署至伺服器以供使用者流覽。 不過,更有趣的案例通常會要求您在部署應用程式之前先編譯應用程式。 因此,讓我們直接跳入,並瞭解如何建置和部署 「Longhorn」 應用程式。

繼續進行第 2 章:建置 「Longhorn」 應用程式

© 2003 Microsoft Corporation. 著作權所有,並保留一切權利。

IntelliSense、Microsoft、MSDN、MS-DOS、Visual Basic .NET 和 Visual Studio .NET 是 microsoft Corporation 在美國和/或其他國家/地區的注冊商標或商標。 在此處所提到的其他產品及公司名稱可能是它們各自擁有人的商標。