初探在下一代 Windows 中編寫和部署應用程式

來源:互聯網
上載者:User

本文內容基於 PDC 召開之前 Microsoft Windows 代號為 “Longhorn” 的版本,此處包含的所有資訊均可能更改。

請下載本文的代碼:Longhorn.exe (113KB)

註:本文是在產品的發行版投入生產之前完成的,因此,我們不能保證這裡包含的任何細節與發行產品中找到的細節完全一樣。文中對產品的描述資訊僅限於本文發表時的產品,並且僅用於規劃方面的用途。本文的資訊隨時可能更改,恕不預先通知。

摘要下一個版本的 Microsoft Windows 作業系統(代號為 "Longhorn"),它不僅標誌著作業系統工作方式的重大改變,而且標誌著應用程式構建方式的重大改變。Longhorn 版本的 Windows 包括一個新的儲存系統和自然搜尋技術,而且更加強調安全機制和可信計算。作者在本文提供了 Longhorn 的概述,討論的重點是一次構建、可部署 n 次的應用程式模型。此外,他還討論了代號為 "XAML"、用於建立 UI 元素的新語言,然後提供了一些操作樣本。

本頁內容
Longhorn 應用程式模型
理解 Longhorn 應用程式
XAML 語言
構建應用程式樣本
結論

從許多方面來看,代號為 "Longhorn" 的下一版 Microsoft Windows 作業系統都是一個重要的裡程碑。"Longhorn" 是第一個用Managed 程式碼構建的作業系統,而且首次採用了最新的儲存子系統(代號為 "WinFS"),這種儲存系統是檔案系統概念的一次革命。它還是第一個支援自然搜尋技術 (Natural UI) 的作業系統,這種技術自動解決了查詢文本固有的許多多義性問題。此外,Longhorn 是第一個以安全機制和可信計算為核心從頭設計的作業系統。上述資訊以及其他特性都表明,Longhorn 將改變應用程式構建的方式 — 這可不是每天都能發生的事情。自從 Windows 問世以來,我記得曾經出現過兩個同樣重要的裡程碑 — 一個是 Windows 由 16 位向 32 位的遷移,另一個是 Microsoft .NET 架構的託管環境的誕生。

Longhorn 中最為重要的一個改變是,這種作業系統使應用程式可以一次編碼,在多個部署方案中使用。為了實現這個偉大的目標,基於 Longhorn 的應用程式是完全物件導向的,整個應用建立在一個核心對象 Application 之上,該對象提供了運行應用程式所需的所有關鍵服務。本文將帶領讀者在一定深度上體驗 Longhorn 應用程式模型,並將它應用於幾個基本樣本,其中包括經典的 Hello World 應用程式。

Longhorn 應用程式模型

Application 對象是 Longhorn 應用程式模型的核心。通過該對象的一整套屬性、方法和事件,您可以使用標記頁集合 — 一種增強版本的 HTML — 來編寫一致而典型的 Windows 應用程式。Application 對象是 Longhorn 提供的根應用程式物件。它提供了基本的應用程式支援,通常用於那些需要低開銷並且不使用頁導航和狀態管理的應用程式。更複雜的 Longhorn 應用程式將使用密切相關的 NavigationApplication 對象,該對象是從 Application 繼承的,但增加了對導航的支援。

一個典型的 Longhorn 應用程式可以視為一組用某些過程代碼編寫指令碼的頁。Application 對象控制著程式的執行,並向使用者代碼產生事件。頁使用一種新的聲明標記語言來編寫,這種語言的代號是 "XAML"(可擴充應用程式標記語言)。利用 XAML 元素,您可以控制每個頁的布局,包括文本和映像的顯示、插入按鈕、文字框等互動式組件。總之,XAML 是用於以聲明方式呈現構成應用程式的頁的使用者介面的語言。當然,除了使用 XAML,您也可以完全使用過程代碼來編寫 Longhorn 的應用程式。一般來說,一個基於 Longhorn 的成功的應用程式會同時具備 XAML 頁和託管過程代碼。您可以按自己的方式來組合它們,但這兩者的任何組合都是可以接受的。

通過結合使用 XAML 和 C#(或 Visual Basic .NET)代碼,您可以構建各種類型的輸出檔案,包括傳統的 Windows 案頭可執行檔、DLL 庫或控制台應用程式。而且,如果您的應用程式足夠簡單的話,也可以使用獨立的 XAML 標記來編寫它。這樣,在 Longhorn 中就增加了另一種類型的應用程式。只要獨立的 XAML 檔案不引用程式碼後置類別,它就可以在 Longhorn Shell(外殼程式)和瀏覽器中運行。最後要說明的是,Windows 可執行檔既可以運行在一個視窗中,也可以運行在瀏覽器中。在這兩種情況下,代碼保持不變,只要以不同的項目屬性重新編譯一遍就可以了。

對於 Longhorn,案頭可執行檔是今天的 Windows 表單用戶端應用程式的下一個版本。但從另一方面來說,XAML 以及以瀏覽器為宿主的應用程式也代表了如今在 Web 上進行用戶端編程模型的一次革新。目前,現有的用戶端應用程式很少部署到 Web 上。如果您要將 Windows 表單嵌入瀏覽器頁,原來的特性會有所減少,您還必須對代碼做相應的修改。而在 Longhorn 中,跨平台 app模型使您可以編寫一個程式,然後在 Web 上部署。不過,最終的應用程式是特定於 Longhorn 的,與傳統的 Web 應用程式(如 ASP.NET)有很大的不同。

當您編譯一個應用程式時,代號為 "Whidbey" 的下一個版本的 Visual Studio 和 .NET 架構(或底層的 MSBuild.exe 工具)會產生一個 .exe 檔、一個應用程式資訊清單(副檔名是 .manifest)和一個部署資訊清單(副檔名是 .deploy)。如果單擊 .exe 檔,應用程式會像您期望的那樣開始運行。但如果將應用程式設定為在瀏覽器中運行,則單擊 .exe 檔後,會啟動 Internet Explorer 的一個執行個體,並在其中運行該應用程式。還有一種可選的方式是,從遠程伺服器部署應用程式。完成部署的步驟如下。首先,將部署資訊清單檔案複製到伺服器的適當位置。可以是 FTP 路徑或 HTTP 路徑。然後,將編譯後的應用程式檔案和清單複製到伺服器上的適當位置。部署資訊清單、應用程式的檔案及清單在伺服器端的位置不一定相同。如果它們放在不同的位置,您可以手動編輯部署資訊清單,使它指嚮應用程式清單的位置。資訊清單檔都是普通的 XML 檔案。當使用者使瀏覽器指向指定的部署位置時,Longhorn 會自動下載應用程式及其清單,然後將它們安裝在用戶端電腦上,同時還建立一個指向 .deploy 檔案的捷徑。最後,使用者單擊 .deploy 檔案就可以運行應用程式。

所有 Longhorn 都有一個共同的結構 — 帶有過程代碼的 XAML 頁(內聯或者使用程式碼後置)— 根對象派生於 Application。Application 對象充當控制器;它的生命週期與應用程式的生命週期是一致的。通過 Application 對象,您可以處理進階事件,有時可以在頁之間共用代碼和狀態。它還負責根據應用程式的邏輯讓使用者在頁之間導航。在一個典型的 Longhorn 程式中,使用者先執行任務,然後通過從一個頁導航到下一個頁在應用程式中前進。導航通常通過用新的頁替代舊的頁來實現。不過,您也可以選擇開啟一個新的彈出式視窗來顯示新的頁。導航並不是所有 Longhorn 應用程式所必需的;只包括一個頁的簡單應用程式就不需要導航。

剛剛提到,除了標記元素,XAML 頁還可以包含過程代碼。過程代碼是必需的,例如,用於處理由頁上的一個 XAML 元素產生的事件。過程代碼既可以內嵌到 XAML 檔案的本文中,也可以放在單獨的程式碼後置檔案中。

Longhorn 中的編程基於Managed 程式碼。不過,只有幾種與 .NET 相容的語言可用於編寫基於 XAML 的應用程式。目前,這類語言套件括 C#、Visual Basic .NET 和 JScript .NET。到 Longhorn 發布時,其他與 .NET 相容的語言也將包括進來。目前只能使用這三種語言的原因是,XAML 檔案的原始碼必須即時分析和編譯,因此,編譯器和相關的文件物件模型必須提前就緒。不過,需要注意的是,如果完全使用過程代碼編寫應用程式,您可以使用任何與 .NET 相容的語言,它們都具備有效編譯器。注意,基於 XAML 的應用程式只能使用這三種語言。如果 XAML 頁中嵌入了過程代碼,那麼您必須先編譯應用程式,然後才能運行它;如果 XAML 頁中沒有過程代碼,那麼雙擊就可以顯示它,就像 HTML 網頁那樣。Longhorn 不處理未編譯的代碼,也不能即時編譯代碼。您一定迫不及待地希望看到 Longhorn 版本的 "Hello World" 應用程式是什麼樣子吧? 下面是一個您可以編寫的最簡單的 XAML 代碼的樣本:

<Canvas     xmlns="http://schemas.microsoft.com/2003/xaml"     Background="LightCyan"     Width="100%" Height="100%">    <Image Source="lh.bmp" Canvas.Left="5" Canvas.Top="5" />  <Text Canvas.Left="90" Canvas.Top="20" FontSize="36">Hello, Longhorn!  </Text></Canvas>

圖 1 簡單的 XAML 頁

將這段代碼儲存在文字檔中並用 .xaml 作為副檔名,然後用 Longhorn 瀏覽器指向該檔案或者在外殼程式中雙擊該檔案即可。圖 1 顯示了結果。<Canvas> 節點定義了應用程式的使用者介面地區 — 基本上,相當於畫布。Background 屬性指定了該地區的背景色,Width 和 Height 則指定了表面的大小。<Image> 和 <Text> 元素定義了該頁的內容。這兩個元素使用父級 Canvas 對象的 Left 和 Top 屬性定義了它們的絕對位置。

返回頁首

理解 Longhorn 應用程式

Longhorn 提供了一組擴充和增強 .NET 架構 1.1 的架構類。Longhorn 中的擴充包括:XAML 支援、儲存系統、應用程式模型、可信計算和進階 Web 服務等。在 Microsoft 的路線圖計劃中,Longhorn 和 Whidbey 代表了兩個截然不同的裡程碑。Whidbey 預期將比 Longhorn 提前幾個月發布,因此,當 Longhorn 發布時,將包括 Whidbey 的升級版本,以提供 Longhorn 中的核心服務。

我們再來看看所有 Longhorn 應用程式共同的基礎 — XAML 語言。XAML 語言是一種基於 XML 的語言,它專門用於描述應用程式的使用者介面。熟悉 Win32 和 .NET 架構的程式員可以看出 XAML 標記和傳統的 Windows 控制項之間明顯的相似之處。不過,相比全套 Win32 公用控制項或 Windows 表單控制項,XAML 標記更抽象,範圍也更廣。為了迅速理解 XAML 代表的含義以及您應該怎樣看待 XAML,可以想想 ASP.NET 頁。或者,更具體一點,您可以想像某個只有伺服器端控制項 (runat="server") 的 ASP.NET 頁,就無需用文字解釋了。

每一個 XAML 標記都對應一個 .NET 架構類,並包括許多方法、屬性和事件。您可以直接在 XAML 指令碼中以聲明的方式來設定屬性和編寫事件,也可以使用封裝到程式碼後置類別的過程代碼。隱藏在每個標記後面的控制項在運行時進行執行個體化,並得到螢幕上的一個地區,以便在上面呈現其輸出。從最高的抽象層級來看,該模型非常像 ASP.NET,只不過這個模型經過抽象後,可用於一般的、更豐富的 Windows 平台。

XAML 中的每個元素都使用一個基礎類,但許多類沒有對應的 XAML 元素。這些類常常是抽象類別,它們大多被用於繼承。用 XAML 建立的任何東西都可以用過程代碼來建立。例如,要用 XAML 建立一個按鈕元素,可使用下面的代碼:

<Canvas xmlns="http://schemas.microsoft.com/2003/xaml">   <Button Canvas.Left="10"            Canvas.Top="10"            Width="90px"            Height="32px">Click Me</Button></Canvas>

也可以用下面的 C# 過程代碼建立一個一模一樣的按鈕:

Button btn = new Button();btn.Width = new Length(90);btn.Height = new Length(32);Canvas.SetTop(btn, new Length(10));Canvas.SetLeft(btn, new Length(10));btn.Content = "Click Me";

在 XAML 檔案中,您不能使用方法,但可以設定屬性 (attribute)。XAML 中的 attribute 通常與類的 property(屬性)相對應,但類的幾個 property 並沒有對應的 XAML attribute。您可以逐個設定類屬性或使用樣式表。樣式表是樣式屬性的集合,編譯器會將它自動應用到使用該樣式表的控制項。所有 XAML 頁都至少有一個 panel 元素,它充當表單容器,並控制子內容的位置以及背景色和字型等全域屬性。XAML 頁的元素是以階層組織的,只有一個根項目。通常,這個根項目是 Panel 派生的類,如 DockPanel 或 Canvas,或是 Decorator 派生的類,如 Border。Canvas 元素用於根據絕對座標來確定內容的位置。一般來說,每個元素被繪製在不同的位置;如果兩個以上的元素被繪製在相同的座標上,元素在標記中出現的順序將決定它們的繪製順序。

除了屬性和方法,XAML 元素還支援許多事件。通過建立事件處理常式,您可以使頁動態地響應各種通知。建立 Longhorn 事件處理常式並關聯到元素的方法與您如今在基於 .NET 的應用程式中使用的方法幾乎是一樣的。事件處理常式通過一個屬性來聲明,然後,處理常式通過程式碼後置類別整合到應用程式中:

<Button Width="90px" Height="25px" Click="OnHandleClick">Click Me</Button>

頁中的元素形成了應用程式樹,這是一個包括了應用程式的所有運行時組件的物件模型,並且可以通過代碼訪問。每個控制項都提供了自己的訪問子級的方法。主要模式有:panel.Children.Add(element)、listbox.Items.Add(object)、button.Content = object 和 textbox.TextRange.Text = string。

支援子級的控制項還支援作為子級的任意對象 — 字串、元素,或某個完全隨機的對象(在這種情況下可調用 ToString)。每個控制項都有一個 Parent 屬性,用於訪問它在樹中的父級。注意,訪問該樹的各個屬性只返回直接的子級,而不是子代。利用物件模型,您可以自如地操縱頁上元素的每個方面。它還提供了一些無法通過 XAML 實現的額外功能。例如,您可以動態地建立元素,但還可以根據運行時條件即時建立元素。

為了更清楚地說明這一點,我們來看第二個應用程式樣本。正如前面提到的,任何規範的 Longhorn 應用程式都包括過程代碼以及 XAML 指令碼。我們將討論一個比最初的 Hello World 應用程式更複雜的情況,並且處理一些事件。

圖 2 顯示了一個新的應用程式的所有原始碼,其中,XAML 被綁定到程式碼後置類別中儲存的某些過程代碼。如果將 XAML 解決方案與 ASP.NET Web Form頁進行比較,除了文法不同之外,您很難發現任何明顯的區別。def:CodeBehind 和 def:Class 屬性封裝 C# 代碼的方式與 Visual Studio 程式碼後置類別封裝 ASP.NET 代碼的方式也非常相似。我們來命名圖 2events.xaml 中的 XAML 檔案,並且命名也出現在圖 2events.xaml.cs 中的程式碼後置類別。如果您將瀏覽器指向該檔案,就會產生一個執行階段錯誤,如圖 3 所示。該錯誤訊息在我使用的組建中不是很清楚,但錯誤的原因非常明顯。該錯誤一定與 XAML 代碼不能被動態編譯有關。與 ASP.NET 不同的是,Longhorn 要求您顯式編譯任何嵌入的或只是由 XAML 指令碼引用的過程代碼。這一特性可能會在未來的組建中有很大的變動,但在目前,它使您不得不在 Visual Studio 中管理 Longhorn 專案檔。或者,您的另一個選擇是,去熟悉 MSBuild,它的可執行檔是 msbuild.exe。Longhorn 解決方案和專案檔的副檔名和結構與 Visual Studio 2003 中是一致的。Longhorn 專案檔大體上如圖 4中列出的代碼所示。

圖 3 XAML 錯誤

專案檔包含有關項目的重要訊息。<Project> 標記指明了編譯器必鬚生成的包的類型。項目屬性和項集中在嵌套標記中 — <ProjectGroup> 和 <ItemGroup>。每個元素的名稱都很易於理解。專案檔在命令列中被傳遞到 msbuild.exe 公用程式。MSBuild 駐留在 Windows/ Microsoft .NET 下的 Framework 檔案夾中。下面的簡單命令產生一個基於 Events.proj 專案檔的可執行檔:

msbuild.exe Events.proj

除非您希望實踐一下 MSBuild 工具,否則,您不必過於關注它。前面提到,Whidbey 版本的 Visual Studio 與 Longhorn SDK 高度整合,只要單擊工具列按鈕或按一下 F5 就可以構建 Longhorn 應用程式。圖 5 顯示了圖 2中的代碼的運行效果。在應用程式樹中,只有一個上面有文字的藍色面板是可見的。應用程式樹其實比您在圖 5 中看到的要稍微複雜一些。根節點是一個包含 DockPanel 對象的視窗。DockPanel 是所有使用者介面元素最外層的容器,它包含一個子級 — FlowPanel,FlowPanel 又包含一個 Text 對象。文本由 Text 類的一個執行個體來表示。您應該已經注意到,XAML 標記有幾個屬性用於控制其顯示。更重要的是,這些標記支援 ID 屬性,ID 屬性提供了運行時標識。只要您在被分配給控制項的地區內單擊滑鼠,與 FlowPanel 類相關聯的 MouseLeftButtonDown 事件就會觸發。此時,將調用 OnLeftMouseDown 事件處理常式代碼。流動面板的寬度和高度變成了原來的兩倍,文字也隨之改變。再次單擊滑鼠,面板又恢複為原來的大小。

圖 5 運行應用程式

雖然您也可以完全使用過程代碼編寫應用程式,但 XAML 檔案使應用程式使用者介面的描述和模板化簡單得多。

返回頁首

XAML 語言

XAML 語言由四個主要類別的元素構成 — 面板、互動控制項、與文檔相關的元素以及圖形。Border(邊框)元素雖然不屬於上述四個類別中的任何一類,但它也很重要。從技術角度來說,它相當於負責細節布局的“裝修工人”,只包含一個子級,但添加了繪製效果。在 XAML 中,面板負責頁面配置,並充當其他元素的容器。面板是管理所包含的元素的繪製、大小和位置、內容安排的組件。Longhorn 中有六個內建的面板類,但開發人員可以用自訂繪製行為來建立自己的面板。預定義的面板包括:Canvas、DockPanel、FlowPanel、GridPanel、Table 和 TextPanel。圖 6 中描述了這些面板類型。

Canvas 面板是預定義面板中唯一支援顯式定位的。它所有的子項目從一個固定的位置開始繪製,延長指定的尺寸。如果兩個元素重疊,後繪製的那個將覆蓋下面的地區。注意,座標是相對於畫布的,這意味著,(0,0) 表示地區的左上方像素。下面是一個畫布對象的樣本:

 <Canvas xmlns="http://schemas.microsoft.com/2003/xaml"    Height="600" Width="800">    <Border Background="red"        Canvas.Top="0px" Canvas.Left="0px"        Height="100px" Width="100px" />     <Border Background="green "        Canvas.Top="100px" Canvas.Left="100px"        Height="100px" Width="100px" />     <Border Background="blue"        Canvas.Top="50px" Canvas.Left="50px"        Height="100px" Width="100px" />  </Canvas>

DockPanel 組件以不同的方式發展出相同的包容概念。這種面板的所有子級都水平或垂直地相互停靠在一起。在這種情況下,定位是相對於前一個控制項的,並且根本不需要座標。DockPanel 是建立顯示效果像工具列這樣的按鈕條的理想選擇。下面是一個樣本:

<Border xmlns="http://schemas.microsoft.com/2003/xaml"     Background="black" >    <DockPanel>        <Button DockPanel.Dock="Left" Width="50px" Height="32px">Open        </Button>        <Button DockPanel.Dock="Left" Width="50px" Height="32px">            Save        </Button>        <Button DockPanel.Dock="Left" Width="50px" Height="32px">Print        </Button>        </DockPanel></Border>

第一個按鈕位於面板的最左側,其他每個按鈕都按水平方向排列在前一個按鈕的旁邊(請參見圖 7)。

圖 7 按鈕布局

FlowPanel 元素使子組件以各種方向在可用的地區中流動。該面板還包含可處理內容超出面板寬度的情況的邏輯。在這種情況下,根據對象的配置,超出部分的內容可以摺疊顯示在下一行或被截掉。下面的 XAML 樣本說明了 FlowPanel 如何中斷內容並使內容折行顯示(這種內容在邏輯上已經設計為適合單個行)。在這個樣本中,四個方形的元素包含在一個更大的元素中。這四個方塊的寬度之和大於容器的寬度。因為所有小方塊不能在一行顯示,這四個方塊被截斷,最後一個方塊在第二行顯示。注意,該面板預設的方向是:從左至右,從上到下:

<FlowPanel xmlns="http://schemas.microsoft.com/2003/xaml"                 Width="250px" Height="250px">        <Border Background="red" Width="75px" Height="75px" />     <Border Background="green" Width="75px" Height="75px" />     <Border Background="blue" Width="75px" Height="75px" />     <Border Background="orange" Width="75px" Height="75px" /> </FlowPanel>

GridPanel 是一個開銷不大的元素,它用類似網格的方式安排對象的布局,從而構建出一個相對比較簡單的表。通過 GridPanel,您可以在行和列上任意放置控制項,構成一個矩陣,但總的來說,它的功能還是很有限的。要構建具有進階功能的更複雜的表,您可以使用 Table 面板。Table 面板的結構是由多組行構成的。您可以為頁首或頁尾定義一組行,還可以插入多組具有不同設定的行。利用該面板的布局功能,您可以為資料建立非常複雜的表格式表示形式。

最後,如果需要複雜的文本布局支援,TextPanel 是一個理想的選擇。不過,對於基本的文本支援,Text 元素是一個更好的選擇,因為它的開銷更小(當然,功能也更少)。

MSAvalon.Windows.Controls 命名空間集中了所有負責使用者互動的使用者控制項。屬於此命名空間的類都是您很熟悉的類:Button、ComboBox、ListBox 和 CheckBox,但也有一些新成員,如 ContextMenu、PageViewer 和 RadioButtonList。使用者互動式元素的基類是 Control,它提供了一組公用的屬性和方法。

圖 8 頁面查看器

比較特別的是,PageViewer 控制項提供了用於查看線上文檔的使用者介面,並且包含分頁和頁導航功能。下面的樣本產生了一個頁面查看器(如圖 8 所示),它佔據了整個工作區。該頁面查看器將 PageViewer 標記的 Source 屬性中指定的檔案中的文本分頁並顯示出來:

<DockPanel ID="root" xmlns="http://  schemas.microsoft.com/2003/xaml"  xmlns:def="Definition">  <Text DockPanel.Dock="Top">See a   PageViewer control in action below.  </Text>  <PageViewer DockPanel.Dock="Top"     Source="Sample.xaml" Height="80%" Width="80%"/>  <Button DockPanel.Dock="Top" Width="50%">OK</Button></DockPanel>

有意思的是,通過 PageViewer 控制項查看的源檔案不能是純粹的文本、RTF 或 HTML。至少在目前,它必須是包含無格式 ASCII 文本、由支援分頁的 Avalon 控制項封裝的 XAML 檔案。Avalon 是 Longhorn 中新的表示子系統的代號(請參見 Charles Petzold 在本期撰寫的文章)。例如,我們來看看 TextPanel 類:

<TextPanel ID="root" xmlns="http://schemas.microsoft.com/2003/xaml">text to show goes here</TextPanel>

將上面的代碼片斷儲存到 sample.xaml,以便運行前面的樣本。記住,xmlns 命名空間是必需的。

MSAvalon.Windows.Documents 命名空間中的類負責文檔的顯示。這些類合在一起,看上去像是進階 HTML 標籤的超集。其中包括的類有:Block、Column、Heading 和 Footer,以及 ColumnGroup、RowGroup、HyperLink、List 等等。

您在前面看到的 Text 類屬於這個預發布版本的 Longhorn 的 System.Windows.Controls 命名空間。Text 類支援多行和各種文字格式設定設定規範,包括粗體和斜體、字型大小,以及嵌套子項目。在所需文本相對比較簡單的情況下,Text 就是理想的類,因為它開銷較小,功能全面。 Longhorn 表示模型通過使用 XAML 面板元素來繪製圖形。面板提供了許多大小和對齊方面的屬性,並且可以控制邊界、背景色和填充。

Longhorn 使用 Windows 向量圖形 (Windows Vector Graphics) 來繪製圖形內容,它與 GDI 和 GDI+ 相比有許多優點。Windows 向量圖形是一個基於 XML、便於使用和重用的圖形標記系統。如果您是可縮放向量圖形的愛好者,您一定也會癡迷於 Windows 向量圖形。Windows 向量圖形提供了預定義的形狀,包括 Ellipse、Line、Path、Polygon、Polyline 和 Rectangle,它們都是從 Shape 類繼承的。這些元素從 Shape 那裡繼承了許多共有的屬性,包括 Stroke 和 StrokeThickness,以及 Fill,再加上一些用於指定座標和頂點的屬性。通過進行變形,形狀可以扭斜、旋轉、平移和縮放。除了可以為形狀指定純色填充色和背景,您還可以指定漸進色。下面的樣本將水平漸進色設定為一個 Rectangle(矩形)形狀的 Fill 屬性,將 Red(紅色)設定為起始色,將 Blue(藍色)設定為最終過渡到的顏色:

<Rectangle xmlns="http://schemas.microsoft.com/2003/xaml"    Canvas.Top="10" Canvas.Left="10"    Fill="HorizontalGradient Red Blue"    RectangleLeft="0" RectangleTop="0"    Width="50" Height="50"/>
返回頁首

構建應用程式樣本

您可以使用 XAML 語言迅速有效地構建一個使用者介面的原型。我敢保證,到 Longhorn 發布時,許多開發工具將會更新(或從新構建),以完全支援具有所見即所得 (WYSIWYG)特性的 XAML。Longhorn 的技術預覽版已經包括了一些到 Whidbey 版本的 Visual Studio .NET 的擴充。下面我們來看一個更規範的互動式應用程式。您很快就會發現,這與編寫 Windows 表單應用程式並沒有太大的不同,而且,您將驚喜地發現,您目前已經掌握的 .NET 技巧可以很好地應用於 Longhorn。如圖 9 所示,您可以看到一個很小的應用程式樣本的使用者介面,介面中包括一個文字框和一個操作功能表。文字框是使用 XAML 定義的;操作功能表是動態建立的。該應用程式的全部原始碼顯示在圖 10 中。

圖 9 操作功能表

在 Longhorn 中,所有應用程式都由 Application 類的一個執行個體來表示。此對象是 Longhorn 應用程式模型的核心。不過,Application 對象只提供基本的應用程式支援,通常只有那些需要低開銷並且不使用導航功能的應用程式才使用該對象。實際上,大多數 Longhorn 應用程式使用密切相關的 NavigationApplication 對象,該對象是從 Application 繼承的,並增加了對導航的支援。

NavigationApplication 對象支援各種方法、屬性和事件,它們使您能夠將大量 XAML 頁組合到一個應用程式中。在某種意義上,基於更簡單的 Application 類的 Longhorn 應用程式是可以與基於對話方塊的 Win32 應用程式進行比較的。同樣,您可以將支援導航的應用程式與完整的 Win32 應用程式進行比較,在這樣的 Win32 應用程式中,各種視窗和表單共同形成了應用程式的整體功能。下面的代碼顯示了這種導航功能的樣本:

myApp = NavigationApplication.Current;win = (Navigation.NavigationWindow) myApp.Windows[0];•••private void Button_Back(Object sender, ClickEventArgs e){    // If possible, go to the previous window    if(win.CanGoBack())       win.GoBack();}

您可以通過使用 Application(或 NavigationApplication)導航對象上的靜態屬性 Current 獲得對應用程式物件的引用。前面的樣本還說明了如何獲得對堆棧中第一個視窗的引用。Button_Back 事件處理常式檢查前一個視窗對象是否存在,如果存在,就以一種類似瀏覽器的方式跳回它那裡。

下一個樣本將說明如何通過派生一個新的類並覆蓋 OnStartingUp 方法來定製導航應用程式啟動時的行為。下面的代碼片斷覆蓋了 OnStartingUp,在應用程式啟動時建立並顯示一個導航視窗:

public class MyApp : NavigationApplication{    NavigationWindow win;    •••    protected override void OnStartingUp(StartingUpCancelEventArgs e)    {        win = new NavigationWindow();        // Add elements to the window        •••          navWin.Show();    }    •••}

讓我們再回到圖 9 中顯示的應用程式樣本。根據我剛剛討論的理由,您可以使用 Application 或 NavigationApplication 作為基類,因為該應用程式將使用一個單視窗、基於對話方塊的應用程式。正在啟動並執行、名為 Sample1 的類覆蓋了 OnStartingUp,並定義了好幾個事件處理常式。覆蓋 OnStartingUp 方法是必需的,因為它表示應用程式啟動的初始化步驟,因此,是在視窗開啟之前執行您自己的操作的理想地點。

在 OnStartingUp 中完成的操作就是視窗的建立。視窗的內容在 XAML 檔案及其程式碼後置類別中描述。XAML 頁本身是由控制項和其他組件構成的,它們被組織在一個具有階層的樹中。正是這些不同的組件(稱為元素)之間的關係在很大程度上說明了頁如何呈現和表現。圖 9 中的樣本頁包括一個 TextBox 控制項,該控制項具有給定的大小和字型。這個文字框被綁定到 ContextMenuEvent 事件。只要使用者右擊控制項的工作區,就立即觸發該事件。

事件處理器將建立一個 ContextMenu 對象(請參見圖 10)。操作功能表經過填充、以圖形方式配置後,就綁定到它的父物件 — TextBox。毫無疑問,在 Longhorn 中,通過選擇背景色和前景色彩、邊框和字型,您可以輕鬆地自訂菜單的外觀(以及所有控制項的外觀)。如果您認為以前版本的 Windows 和 .NET 架構也有可能完成同樣的任務,那您就錯了。在 Win32 中,這種自訂需要許多編程工作,一點也不簡單。而在 .NET 架構中,封裝類封裝了必要的代碼,只留下很少的屬性供使用者控制。另一方面,在 Longhorn 中,控制項的使用者介面就像它看上去那樣簡單。

操作功能表的元素是從 MenuItem 類建立的。使它們觸發事件處理常式的方式幾乎與基於架構的應用程式完全一樣:

mia = new MenuItem[3];for (int i=0; i<3; i++){    mia[i] = new MenuItem();    cm.Items.Add(mia[i]);    mia[i].Foreground = Brushes.Black;}mia[0].Header = "Lower Text";mia[1].Header = "Upper case";mia[2].Header = "Select all";mia[0].Click += new ClickEventHandler(LowerCase); mia[1].Click += new ClickEventHandler(UpperCase); mia[2].Click += new ClickEventHandler(SelectAll);

當某個功能表項目被單擊後,立即執行事件處理常式,並使用傳遞的第一個參數來檢索對其來源物件的引用:

public void LowerCase(Object sender, ClickEventArgs args){    MenuItem mi = (MenuItem) args.Source;     ContextMenu menu = (ContextMenu) mi.Parent;    TextBox thisTextBox = (TextBox) menu.PlacementTarget;    thisTextBox.Text = thisTextBox.Text.ToLower();} 

為了檢索 TextBox,您必須在樹中向上追溯。首先,到達 MenuItem,然後是 ContextMenu,最後,您就可以訪問其所有者 TextBox 了。此時,修改 TextBox 的內容顯得輕而易舉。

返回頁首

結論

Longhorn 代表了 Windows 作業系統曆史上的一個重要裡程碑。它將成為第一個專門圍繞Managed 程式碼進行設計的 Windows 版本。新的應用程式模型進一步確立了 Longhorn 的重要意義;過去在基於 .NET 架構的應用程式(尤其是 ASP.NET 應用程式)的應用建模方面的豐富經驗使它的設計和實現達到了頂點。

Longhorn 應用程式是圍繞 Application 對象構建的,使您能夠將大量標記頁組合在一個作為整體存在的應用程式中。您還可以將 Longhorn 應用程式背後的 XAML 語言視為設計 Longhorn 應用程式模型時所採用的抽象層級的標誌。Longhorn 的最終目標是,允許您一次編碼,可在各種方案中進行部署,無論這些方案是基於 Web,還是基於用戶端。

介紹一種沒有多少人用過的新平台的應用程式模型可不是件容易的事情。如果考慮到有些方面很可能在將來還會發生重大變化,這個任務就顯得更困難了。從這個角度來說,您可以將本文視為一張快照,以此來瞭解 Longhorn 目前的情況以及未來的發展方向。

我已經提供了可作為代碼進行下載的項目樣本,以便協助您實踐 Longhorn。您可以單擊本文開頭的連結,以獲得此項目。

Dino Esposito 在意大利羅馬工作,任職教員兼顧問。作為 Microsoft Press 推出的《Programming ASP.NET》的作者,他將大多數時間用於教授 ADO.NET 和 ASP.NET 方面的課程以及在各種會議上演講。如果希望與 Dino 聯絡,請寄送電子郵件至cutting@microsoft.com。

轉到原英文頁面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.