天天看點

WPF入門XAML詳解

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)中的邏輯代碼融合到一起,形成單一的單元。

  1. InitializeComponent()方法

在生成的MainWindow類中,預設的構造函數會調用

InitializeComponent()

方法。該方法在源代碼中是不可見的,這是在編譯應用程式時自動生成的。該方法本質是調用了

System.Windoes.Application

類的

LoadComponent()

方法。

  1. 命名元素

如果要通過代碼來操作控件,控件必須包含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>
           

效果如下:

WPF入門XAML詳解

任何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"
           

小案例:

繼續閱讀