競爭接口 Avalon 是下一版本的 Windows(代號
Longhorn
)的一部分
主要由添加到
NET 框架中新的類集合組成
目前
用於 Avalon 編程的最重要的新命名空間有多個名稱
例如
MSAvalon
Windows
MSAvalon
Windows
Controls 和 MSAvalon
Windows
Media
(在 Longhorn 最終發布之前
這些名稱將進行更改
)有了 Avalon
您就可以利用 C#
Visual Basic®
NET 或者任何其他支持
NET 公共語言規范 (CLS) 的語言編寫應用程序
這些程序與目前可編寫的 Windows 窗體應用程序頗為相似
即
Avalon 的標准部分
另外
Avalon 還會定義一個可在 Longhorn 中使用的新標記語言
其代號為
XAML
(可擴展應用程序標記語言
讀作
zammel
)
可以使用 XAML 來定義文本
圖像和控件的布局
這與使用 HTML 非常相似
因為基於 XML
所以 XAML 的語法比 HTML 更嚴謹
更明確
預計大部分的 XAML 均可通過可視化設計程序由計算機生成
但是(最初)手工編寫自己的 XAML 會是一次絕佳的學習體驗
大多數寫入 Avalon 的應用程序均可能同時包含程序代碼和 XAML
您將使用 XAML 定義應用程序初始的可視界面
並編寫用於實現其他功能的代碼
您可以將程序代碼直接嵌入到 XAML 中
也可以將它保留在一個單獨的文件內
能夠用 XAML 實現的所有功能均可以通過程序代碼實現
因此
根本無需使用任何 XAML 也有可能編寫程序
但是
反之則不行
許多任務只能通過程序代碼完成
因此
只有最簡單的應用程序才會只包括 XAML
下面是某個 XAML 的一小段代碼
<Button Background=
LightSeaGreen
FontSize=
pt
>
Calculate
</Button>
該片斷是一個 XML 元素
包括一個開始標記
一個結束標記以及這兩個標記之間的內容
該元素的類型是 Button
開始標記還包括了兩個屬性規范
這兩個屬性的名稱為 Background 和 FontSize
它們被指定了屬性值
根據 XML 的要求
這些值必須用單引號或雙引號引起來
開始標記和結束標記之間是元素內容(在本例中是顯示在按鈕表面上的文本)
此 Button 元素不包括寬度或高度
通常
Avalon 中的按鈕和其他控件會根據其內容自動調整大小
(當然
您可以重寫該行為
)在本例中
Button 的大小被設置為足以容納
磅字體的
Calculate
文本字符串
此 Button 元素也不包括坐標位置
通常
控件在運行時會根據窗口和控件的大小在窗口中動態定位
XAML 與 Avalon 類庫緊密相關
可以在 XAML 中使用的每種元素實際上都是一個類
特別是
在 MSAvalon
Windows 命名空間中聲明的 UIElement 或 ContentElement 類的子代
Control 是 UIElement 的子代之一
所有公共用戶接口控件(例如
按鈕
滾動條
列表框
編輯字段等)均源自 Control
從 ContentElement 派生的類包括 Bold 和 Italic
在 XAML 開始標記中指定的屬性名實際上是這些類的屬性
屬性在
NET 框架中總是扮演著重要的角色
而在這裡扮演的角色則更為重要
如果您還沒有任何
NET 框架的編程實踐
也應該知道屬性是類的成員
就像方法和字段一樣
在使用過程中
它們好象與字段相似
但是它們的實現更接近於方法
不同於字段
屬性是包含代碼的
屬性是可讀的
可寫的或二者兼有
一個名為 Background 的讀/寫屬性基本上等同於 set_Background 和 get_Background 這一對對稱方法
當然
現代的程序員希望知道
我是否可以將自己的類用作 XAML 元素?答案是
當然可以
出於某種原因
XAML 被稱為可擴展應用程序標記語言
任何一個具有公共的無參數的構造函數以及可設置屬性的類均可在 XAML 中使用
我剛才展示的 Button 元素相當於一段完成以下操作的代碼
創建一個 Button 類型的對象
然後對 Background
FontSize 和 Content 屬性進行賦值
等效的 C# 代碼如下所示
Button btn = new Button();
btn
Background = Brushes
LightSeaGreen;
btn
FontSize = new FontSize(
FontSizeType
Point);
btn
Content =
Calculate
;
正如您所看到的那樣
在 XAML 中定義該對象大大簡化了對這三個屬性賦值的過程
Brushes 類由所有預定義顏色(與 HTML 中通常支持的顏色相同)的靜態屬性組成
FontSize 是一個結構
其中封裝了獨立於單位的度量
FontSizeType 是一個枚舉
無論屬性被定義為字符串
整數
浮點值
布爾值
枚舉還是某種其他類型
等效的 XAML 屬性都只是被賦予一個文本字符串
Content 屬性指出在按鈕表面上顯示的內容
並與 XAML 中 Button 元素的內容相對應
這表明還可以按以下方式編寫 Button 元素
<Button Background=
LightSeaGreen
FontSize=
pt
Content=
Calculate
>
</Button>
因為此 Button 元素設置了 Content 屬性
而且在它的開始標記和結束標記之間不再包括任何內容
所以可將它寫為空元素標記
<Button Background=
LightSeaGreen
FontSize=
pt
Content=
Calculate
/>
注意該元素結尾處的結束斜槓
在本例中
Content 似乎是 string 類型的屬性
但這並不是問題的全部
Content 屬性聲明為類型對象
強烈建議按鈕的內容不必局限於簡單的文本字符串
例如
它可以是 Image 元素
<Button> <Image Source=
Calc
jpg
/> </Button>
如果您希望自己的按鈕既顯示文本又顯示圖像
則可以包括
<Button>
Calculate
<Image Source=
Calc
jpg
/>
</Button>
文本和圖像元素將並排出現
(這樣的元素通常是指父 Button 元素的子元素
)Button 元素不支持更復雜的布局特性
但如果需要
它也是可用的
訣竅是將 Button 的內容指定為支持靈活布局選項的 XAML 元素(例如
Text)
下例中的按鈕
其內容是一個 Text 元素
該元素中又包含一個圖像
一個分行符和一個文本字符串
<Button FontSize=
pt
>
<Text>
<Image Source=
Calc
jpg
/>
<LineBreak/>
Calculate
</Text>
</Button>
LineBreak 元素等同於 HTML 中的 <br>
能夠顯示下方具有文字的圖像的按鈕更適用於工具欄
您可以用某種斜體文本格式使該按鈕更生動一些
<Button FontSize=
pt
>
<Text>
<Image Source=
Calc
jpg
/>
<LineBreak/>
Calculate <Italic>this</Italic>
</Text>
</Button>
該示例很好地說明了標記語言中的內容看上去非常自然
但是用代碼表示時卻相當不方便的一面
實際上
您可以在代碼中指定所有這些元素
但是您為什麼要這樣做呢?
既然您對 XAML 有了一些了解
那麼現在就讓我們來看一些完整的程序吧
圖
顯示了傳統的 Hello World 程序的簡單 XAML 實現
在 XML 中只允許使用一個根元素
而在 XAML 中
這個根元素通常是輸出圖面
TextPanel 是一個輸出圖面
它提供類似於 HTML 的自動布局
通常
對於應用程序的每一頁都有一個 XAML 文件(如果應用程序確實有多個頁)
而且對於每個對話框也都有一個 XAML 文件
有一個名為 Styles 的功能(我將在以後對此稍加討論)有助於在您的程序中保持一致的視覺樣式
TextPanel 元素中 xmlns(XML 命名空間)屬性的功能與 C# 中使用指令所實現的功能相同
因為 XAML 文件中的所有元素都映射到了 Microsoft
NET 框架中的等效類
所以 xlmns 屬性提供了一個指向某個文件的 URI
該文件會列出在其中聲明這些類的
NET 命名空間的名稱
僅僅為了使 Hello World 程序更加吸引人
我向 TextPanel 元素中添加了幾個屬性來設置顏色和字體
並指定該元素的子元素在面板中水平居中
TextPanel 元素的內容是字符數據
Hello
world!
其內容中還可以包括圖像
控件
更多的文本等
由於其中沒有代碼
因此您可以將 HelloWorld
xaml 文件直接加載到 Microsoft Internet Explorer 的 Longhorn 版本中
然後您將看到類似於一個 Web 頁的內容
還可以使用一個目前稱作 MSBuild 的程序來編譯 HelloWorld
xaml
進行這種編譯時
還需要兩個其他的短文件(此處未顯示)
其中一個擴展名為 PROJ 或 MSPROJ 的文件會提供有關該程序的一些信息並列出所有必需的源文件(XAML 以及其他文件)
還需要另外一個 XAML 短文件來指出執行該程序時首先顯示哪個 XAML 頁
運行 Hello World 的可執行文件
您將看到一個類似於 Windows 程序的內容
圖
同時顯示了這兩個版本
educitycn/img_///gif> 圖 Hello World 作為頁面和作為程序 圖
顯示了與此程序幾乎等效的 C# 版本
(我之所以說幾乎等效
是因為 MSBuild 能夠拋出 C# 代碼
但是這不是它所拋出的全部內容
我的版本更容易理解一些
)您可以按照以下方式
在命令行上編譯該程序
csc /r:WindowsBase
dll;PresentationCore
dll;PresentationFramework
dll
有經驗的 Windows 窗體用戶會發現該程序的結構和外觀似乎有些熟悉
該程序負責在創建 TextPanel 對象之前
顯式創建一個應用程序對象和一個窗口對象
在該程序的 XAML 版本中
這些預備作業是隱含的
此 C# 代碼的奇怪之處涉及到在窗口中顯示的文本字符串
在 Windows 程序中
通常需指定要顯示文本的坐標位置
但是 Te
From:http://tw.wingwit.com/Article/os/youhua/201401/30203.html