1. 程式人生 > 實用技巧 >【概念】XML屬性-標記擴充套件及附加屬性

【概念】XML屬性-標記擴充套件及附加屬性

1、標記擴充套件

  對大多數屬性而言,XAML屬性語法可以工作的非常好。但是有些情況下,不可能硬編碼屬性值。例如,可能希望將屬性值設定為一個已經存在的物件,或者可能希望通過將一個屬性繫結到另外一個控制元件來動態地設定屬性值。這兩種情況都需要使用標記擴充套件——一種以非常規的方法設定屬性的專門語法。

  標記擴充套件可用來巢狀標籤或XML特性中(用於XML特性的情況更常見)。當用在特性中時,它們總是被花括號{}包圍起來。例如,下面的標記演示瞭如何使用標記擴充套件,它允許引用另外一個類中的靜態屬性:

1 <Button Foreground="{x:Static SystemColors.ActiveCaptionBrush}
"></Button>

標記擴充套件使用{標記擴充套件類 引數}語法。在上述的示例中,標記擴充套件是StaticExtension類(根據約定,在引用擴充套件類時可以省略最後一個單詞Extension)。x字首指示在XAML名稱空間中查詢StaticExtension類。還有一些標記擴充套件是WPF名稱空間的一部分,它們不需要x字首。

  所有標記擴充套件都由繼承自System.Windows.Markup.MarkupExtension基類的類實現。MarkupExtension基類十分簡單——它提供了一個簡單的ProvideValue()方法類獲取所期望的數值。換句話說,當XAML解析器遇到上述語句時,它將建立StaticExtension類的一個例項,然後呼叫ProvideValue()方法獲取靜態物件。最後找到按鈕的Foreground屬性。

2、附加屬性

  除普通屬性外,XAML還包括附加屬性(attached property)的概念——附加屬性是可用於多個控制元件但在另外一個類中定義的屬性。在WPF中,附加屬性常用語控制元件佈局。

  每個控制元件都有各自固有的屬性。當在容易中方式控制元件時,根據容器的型別控制元件會獲得額外特徵(例如,如果在網格中放置一個文字框,就需要選擇文字框放在網格控制元件中的哪個單元格中),使用附加屬性設定這些附加的細節。

  附加屬性始終使用包含兩個部分的命名格式:定義型別.屬性名。這種包含兩部分的命名語法使XAML直譯器能區分開普通屬性和附加屬性。

如下程式碼中,Grid.Row=“0”就是屬於附加屬性。

 1 <TextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch"  Margin="10,10,13,10" TextWrapping="Wrap" Grid.Row="0" FontFamily="Verdana" FontSize="24">
 2             [Please Question here!]
 3         </TextBox>
 4         
 5         <Button  VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,0,0,20" Grid.Row="1" Width="127" Height="23" Name="btnAnswer" Click="btnAnswer_Click">
 6             Ask the Eight Ball
 7         </Button>
 8         <TextBox Grid.Row="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" TextWrapping="Wrap" IsReadOnly="True" Margin="10,10,13,10" FontFamily="Verdana" FontSize="24" Foreground="Green">
 9             [Answer will appear here!]
10         </TextBox>