XAML
XAML(Extensible Applications Markup Language)用於實例化.net對象的標記語言。
創建一個WPF應用程序,生成的基本框架如下:
<Window x:Class="_001XAML.MainWindow"
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"
xmlns:local="clr-namespace:_001XAML"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
這個文檔只包含兩個元素——頂級的Window元素和Grid元素,Window元素代表整個窗口,Grid元素中可以放置所有控件。WPF應用程序只使用使用以下幾個元素作為頂級元素:
- Window元素
- Page元素(該元素和Window元素類似,但是它用於導航的應用程序)
- Application元素(該元素定義應用程序和啟動設置)
XAM文檔中只能有一個頂級元素。
Title="MainWindow" Height="450" Width="800"
Title
屬性定義了應用程序的標題,Height
屬性定義了窗體的高度,Width
屬性定義了窗體的寬度。
XAML名稱空間
xmlns
特性是XML中的一個特殊的特性,它專門用於聲明名稱空間。在創建的WPF XAML文檔中都會使用這兩個名稱空間:
-
http://schemas.microsoft.com/winfx/2006/xaml/presentation
是WPF核心名稱空間。包含了所有的WPF類,包括用於構建用戶界面的控件。 -
http://schemas.microsoft.com/winfx/2006/xaml
是XAML名稱空間。它包含各種XAML實用特性,這個命名空間被映射為前綴x,可用通過在元素名稱之前放置一個名稱空間前綴來使用這個名稱空間(例如:x:ElementName)
代碼隱藏類
通過XAML構造用戶界面,通過代碼隱藏類連接包含應用程序的事件處理程序的方法。
<Window x:Class="_001XAML.MainWindow"
Class特性告訴XAML解析器使用指定的名稱生成一個新類。該類繼承自由XML元素命名的類。換句話說,這個示例創建了一個MainWindow的新類,該類繼承自Window這個基類。
namespace _001XAML
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
當編譯應用程序時,定義用戶界面的XAML(如這里的MainWindow.xaml)被轉換為CLR類型聲明,和代碼隱藏類文件(如MainWindow.xaml.cs)中的邏輯代碼融合到一起,形成單一的單元。
- InitializeComponent()方法
在生成的MainWindow類中,默認的構造函數會調用InitializeComponent()
方法。該方法在源代碼中是不可見的,這是在編譯應用程序時自動生成的。該方法本質是調用了System.Windoes.Application
類的LoadComponent()
方法。
- 命名元素
如果要通過代碼來操作控件,控件必須包含XAML.Name屬性。比如要操作Grid控件,可以添加名稱:
<Grid x:Name="grid1">
</Grid>
XAML中的屬性和事件
簡單屬性
給一個文本框設置屬性,設置對齊方式、設置頁邊距和字體。
<TextBox Name="txtAnswer"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
FontFamily="Times New Roman" FontSize="24" Foreground="Green"
>
...
</TextBox>
復雜屬性
有些屬性是一個對象,對象本身有自己一系列的屬性。屬性元素語法(property-element syntax),可以添加一個名稱形式為Parent.PropertyName
的子元素。比如給Grid控件的Background屬性添加繪制背景區域的畫刷,可以添加名為Grid.Background的子標簽。
<Grid>
<Grid.Background>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.00" Color="Red"/>
<GradientStop Offset="0.50" Color="Indigo"/>
<GradientStop Offset="0.10" Color="Violet"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Grid.Background>
</Grid>
效果如下:
任何XAML標簽集合都可以使用一系列執行相同任務的代碼語句代替。
標記擴展
如果要將屬性值設置為一個已經存在的對象,或者是希望通過一個屬性綁定到另一個控件來動態地設置屬性值。就需要使用標記擴展。
標記擴展可以用於嵌套標簽或XAML特性中,當用於特性中,總是被花括號{}包起來使用。
<Button Name="button" Width="100" Height="50" Content="Button" Background="{x:Static SystemColors.ActiveCaptionBrush}"></Button>
這段XAML的最終結果和下面的一樣:
button.Background = SystemColors.ActiveCaptionBrush;
因為標記擴展映射為類,所以他們也可以被用作嵌套屬性:
<Button Width="100" Height="50" Content="Button">
<Button.Background>
<x:Static Member="SystemColors.ActiveCaptionBrush"></x:Static>
</Button.Background>
</Button>
標記擴展在使用資源和數據綁定時會大量用到。
附加屬性
附加屬性(attached property)用於多個控件在另一個類中定義的屬性。附加屬性常用於控件布局。
事件
特性也可以用於關聯事件處理程序,用於關聯事件處理程序的語法為:事件名="事件處理程序方法名"。
比如,Button控件提供一個Click事件:
<Button Name="button" Click="button_Click"></Button>
上述標記在代碼隱藏類中必須對應的事件處理方法。
private void button_Click(object sender, RoutedEventArgs e)
{
// do something
}
使用其他名稱空間中的類型
為使用未在WPF名稱空間中定義的類,需要把.NET名稱空間映射到一個XML名稱空間。XAML有一個特殊的語法完成這項工作:
xmlns:Prefix="clr-namespace:Namespace;assembly=AssemblyName"
通常再XAML的根元素中,在緊跟WPF和XAML名稱空間特性之后,放置這個名稱空間。
-
Prefix用於指示名稱空間的XML前綴
-
Namespace是完全限定的.NET名稱空間的名稱
-
AssemblyName是聲明類型的程序集
比如,如何訪問System名稱空間中的基本類型,並把它們映射為前綴sys:
xmlns:sys="clr-namespace:Systemlassembly=mscorlib"
訪問當前項目在MyProject名稱空間中聲明的類型,並把它們映射為前綴local:
xmlns:local="clr-namespqce:MyNamespace"
小案例: