天天看點

WPF學習筆記(二)x名稱空間

x名稱空間由來:

x名稱空間裡的成員是專門為XAML編譯器看的,用來引導XAML編譯器把XAML編譯成CLR代碼,是以x是XAML的首字母。通過x空間的成員告訴編譯器怎麼編譯XAML,生成什麼類名,屬性的可通路性等。

x命名空間包含的工具

名稱 種類(在XAML中出現的形式)
x:Array 标簽擴充
x:Null 标簽擴充
x:Static 标簽擴充
x:Type 标簽擴充
x:Class Attribute
x:ClassModifier Atteribute
x:FieldModifter Atteribute
x:Key Atteribute
x:Name Atteribute
x:Shared Atteribute
x:Subclass Atteribute
x:TypeArguments Atteribute
x:Uid Atteribute
x:Code XAML指令元素
x:XData XAML指令元素

x名稱空間中的Attribute:

x:Class,用來告訴XAML編譯器把XAML标簽的編譯結果與背景代碼的哪個類合并,隻能用于根節點,并且根節點的類型要與背景代碼的類保持一緻。

x:ClassModifier,用來告訴XAML編譯器把XAML标簽編譯成的類具有怎樣的通路級别,必須具有x:Class Attribute的标簽才能應用,并且與指定的後端代碼通路級别一緻。

x:Name,它的作用有兩個:(1)告訴XAML編譯器,當一個标簽帶有x:Name時除了為這個标簽生成對應執行個體外還要為這個執行個體聲明一個引用變量,變量名就是x:Nmae的值。(2)将XAML标簽所對應對象的Name屬性(如果有)也設為x:Name的值,并把這個值注冊到UI樹上,以友善查找。

x:FieldModifier,用來告訴XAML編譯器由該标簽生成的類的字段的通路級别,預設為internal。在程式設計的時候,有時候我們需要從一個程式集通路另一個程式集中的元素,這時就需要把被通路的空間的引用變量改為Public級别,x:FieldModifier就是用在XAML裡改變引用變量通路級别。

<StackPanel>
<TextBox x:Name="textBox1" x:FieldModifier="public" Margin="5"/>
<TextBox x:Name="textBox2" Margin="5"/>
</StackPanel>
           

注意:因為x:FieldModifier是用來改變引用變量通路級别的,是以使用它的前提是這個标簽同時也是用了x:Name,不然何來的引用變量呢?

x:Key,為資源字典指定key值,在XAML中通過StaticResource标記擴充進行資源檢索時使用,并且可以自動向父級元素檢索并一直遞歸直到找到該資源或到達Application。通過在代碼中使用.FindResource方法也可以進行遞歸檢索資源。

x:Shared,與x:Key配合使用,用來指定檢索資源對象時,是使用同一個對象副本還是不同的對象,預設x:Share=“True”,是以資源檢索得到的是同一個對象。

x名稱空間中的标記擴充:

x:Type,類型為TypeExtension的标記擴充,用來在XAML中指定Type類型,與C#中的typeof關鍵字類似。x:Type的預設參數為類型,如{x:Type local:MyWindow}或{x:Type TypeName=local:MyWindow}。

x:Null,類型為NullExtension的标記擴充,用來在XAML中顯示為屬性指定Null值,如果在資源字典中定義了Style并把key和TargetType都指定為目标類型,則目标類型的所有标簽都預設使用該Style。如果控件不想使用預設Style,則可以為Style指定null,如Style={x:Null}。如下圖所示:

<Button Content="OK">
    <Button.Style>
        <x:Null/>
    </Button.Style>
</Button>   
           

為了保持代碼簡潔,一般很少用,但有一個例外,那就是 x:Array 标記擴充——如果想要在XAML文檔中聲明一個包含資料x:Array

執行個體,必須使用标簽式聲明才能做到。

x:Array,它的作用就是通過它的Items屬性向使用者暴露一個類型已知的ArrayList執行個體,ArrayList内成員的類型由 x:Array 的Type指明。下面的這個例子是把一個x:Array當做資料源向一個ListBox提供資料。

在WPF中包含資料的對象稱為資料源(Data Source),如果想把一個x:Array的執行個體作為資料源提供給一個ListBox的話,代碼是這樣寫的:

<Windows x:Class="WpfApplication1.Windows1"
···
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="120" Width="160">
<Grid Background="LightBlue">
<LisBox Margin="5" ItemsSource="{x:Array Type=sys:string}"/>
</Grid>
</Windows>
           

此時,作為資料源的x:Array 執行個體是沒有資料提供的,是以我們需要在x:Array執行個體添加一些資料。但由于向ArrayExtension中添加資料需要調用它的AddChild方法,但在XAML中我們無法編寫邏輯代碼,并且ArrayExtension的Items屬性是隻讀的,是以我們不可能用ItemsSource=“{x:Array Type=sys:String Items=XXXXX}”的形式指派,隻能使用标簽文法,如以下代碼片段

<ListBox>
                <ListBox.ItemsSource>
                    <x:Array Type="sys:String">
                        <sys:String>String1</sys:String>
                        <sys:String>String2</sys:String>
                        <sys:String>String3</sys:String>
                    </x:Array>
                </ListBox.ItemsSource>
            </ListBox>
           

這樣,在解析标簽的時候編譯器會生成調用AddChild方法的代碼把标簽的子元素逐個添加到x:Array執行個體的Iteams裡。

x:Static,類型為StaticExtension的标記擴充,用來在XAML中引用類的靜态字段或靜态屬性,如Text={x:Static local:Window1.ShowText}。

XAML指令元素:

XAML指令元素隻有兩個,x:Code和x:XData,x:Code用來把C#代碼放到XAML中,x:XData用來為資料提供者提供資料,如以下代碼片段

<Page.Resources>
        <XmlDataProvider x:Key="asdf">
            <x:XData>
                <Root>
                    <Item>Item1</Item>
                    <Item>Item2</Item>
                </Root>
            </x:XData>
        </XmlDataProvider>
    </Page.Resources>
           

繼續閱讀