深入淺出WPF筆記——X名稱空間詳解

“x”名稱空間的成員引導(dǎo)XAML編譯器將XAML編譯成CLR代碼的∑谰兀“x”就XAML首字母篮愉。凡包含XAML代碼的WPF程序都需要通過語句 xmlns: x="http:// schemas.microsoft.com/winfx/ 2006/xaml"引入耻矮。此名稱空間是程序員與XAML編譯器溝通的工具初厚。

x名稱空間都有什么東東

x名稱空間有Attribute、標(biāo)記擴(kuò)展和XAML指令元素組成郑叠。如下表夜赵。

名稱 種類(XAML出現(xiàn)的形式)
x:Array,x:Null,x:Static,x:Type 標(biāo)記擴(kuò)展
x:Code,x:XData XAML指令元素
x:Key,x:Name,x:Class,x:FeildModifer Attribute
x:ClassModifer,x:Shared,x:TypeArgument,x:Uid Attribute

Attribute

Attribute:語言層面的東西, 是給編譯器看的乡革。
Property:對象上面的東西寇僧,是給編程邏輯用的。
XAML標(biāo)簽的Attribute大部分對應(yīng)對象的Property沸版。在XAML編程中嘁傀,你想添加特殊的標(biāo)記從而影響XAML編譯器的解析,這時候就要添加一些Attribute了视粮。

<window x:Class="ClassName">
<!--告訴XAML編譯器將編譯結(jié)果與哪個C#編譯的類合并-->
</window>

x:Class

x:Class告訴XAML編譯器將XAML標(biāo)簽的編譯結(jié)果與后臺代碼中指定的類合并细办。在使用時遵循以下要求:

  • 只能用于根結(jié)點(diǎn)(如:window、UserControl)
  • 使用x:Class的根結(jié)點(diǎn)的類型與x:Class的值所指示的類型保持一致
  • x:Class所指示的類型在聲明時必須用partial關(guān)鍵字

x:ClassModifier

x:ClassModifier告訴XAML編譯器標(biāo)簽編譯生成類的訪問級別蕾殴。這個Attribute需要注意以下幾點(diǎn):

  • 標(biāo)簽必須具有x:Class
  • x:ClassModifier值與x:Class`所指類的訪問級別一致
  • x:ClassModifier與后臺代碼的不同而不同笑撞,參見TypeAttributes
    例:x:ClassModifier="internal"

x:Name

x:Name給標(biāo)簽對象起個名子,也就是生成對象實(shí)例并為它聲明一個引用變量钓觉,通過這個變量方便C#代碼調(diào)用這個實(shí)例茴肥。
注意:

  • 如果一個標(biāo)簽的對象有Name屬性,為方便查找將x:NameName賦值相同并注冊在UI樹上荡灾。
  • Name屬性WPF控件的基類屬性瓤狐,所有控件都有Name屬性瞬铸。
  • 當(dāng)一個對象有Name屬性,使用x:NameName等同础锐。為提高代碼統(tǒng)一性嗓节,統(tǒng)一使用x:Name
<StackPanel>
        <Button x:Name="button1" Margin="5"/>
        <TextBox x:Name="textBox1" Margin="5"/>
 </StackPanel>

x:FeildModifier

x:FeildModifier改變引用變量的訪問級別。使用前必須通過x:Name聲明引用變量郁稍。

<Button x:Name="btn1" x:FeildModifier="public" Content="Click Me" />

x:Key

x:KeyResource(資源)檢索的索引赦政。

    <Window.Resources>
        <sys:String x:Key="Hello World">Hello World!</sys:String>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{StaticResource ResourceKey=Hello World}"/>
    </StackPanel>

x:Shared

x:Sharedx:Key配合使用胜宇。當(dāng)x:Shared="true"通過x:Key檢索的對象為同一個對象耀怜。如果x:Sharp="false"通過x:Key檢索的對象是此對象的新副本。

標(biāo)記擴(kuò)展

標(biāo)記擴(kuò)展(Markup Extension)實(shí)際上就是MarkupExtension類直接或間接的派生類桐愉。

x:Type

x:Type的值代表一個數(shù)據(jù)類型的名稱财破。一般情況下,我們在編程中操作著數(shù)據(jù)類型的實(shí)例或是實(shí)例的引用从诲。但有些時候我們還會用到數(shù)據(jù)類型本身左痢。

在XAML中表達(dá)一個數(shù)據(jù)類型就要用到x:Type。比如一個類的屬性是一個數(shù)據(jù)類型系洛,當(dāng)給此類賦值時俊性。引用一下書中的例子

首先創(chuàng)建一個Button的派生類MyButton,里面包含一個名為UserWindowType的Type類型的屬性描扯。

    public class MyButton : Button
    {
        public Type UserWindowType { get; set; }

        protected override void OnClick()
        {
            base.OnClick();
            Window win = Activator.CreateInstance(this.UserWindowType) as Window;
            if (win != null)
            {
                win.ShowDialog();
            }
        }
    }

然后創(chuàng)建一個Window的一個派生類MyWindow定页。

<Window x:Class="SamplesForWPF.MyWindow"
        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:SamplesForWPF"
        mc:Ignorable="d"
        Title="MyWindow" Height="150" Width="300">
    <StackPanel Background="LightBlue">
        <TextBox Margin="5"/>
        <TextBox Margin="5"/>
        <TextBox Margin="5"/>
        <Button Content="OK" Margin="5"/>
    </StackPanel>
</Window>

最后把自定義按鍵MyButton放在主窗口,并將MyWindow賦值給MyButton.UserWindowType绽诚。

<Window x:Class="SamplesForWPF.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:SamplesForWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">
    <StackPanel Background="LightBlue">
        <local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/>
    </StackPanel>
</Window>

TypeExtension類的構(gòu)造器支持類型名參數(shù)典徊,所以可以寫成

UserWindowType="{x:Type local:MyWindow}"

x:Null

x:Null與C#的Null意義相同,代表一個空值恩够。在XAML中卒落,如果給某個對象的屬性賦一個空值,我們可以這樣寫

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

標(biāo)記擴(kuò)展的兩種聲明語法

常用的方法用朱{}括起來

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

另外一種語法如下

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

大多數(shù)情況我們都會使用第一種語法蜂桶,看起不來簡潔明了儡毕。有一個另外,就是x:Array扑媚。

x:Array

x:Array的作用就是通過它Items屬性向使用者暴露一個類型已知的ArrayList腰湾。ArrayList的成員類型由x:Array的Type屬性指明。

<ListBox Margin="5" ItemsSource="{x:Array Type=sys:String}"/>

一個String類型的ArrayList作為Data Source賦給了ListBox钦购。此時的ArrayList是一個空的檐盟,我們要通個下面的代碼向Items添加數(shù)據(jù)

          <ListBox Margin="5">
            <ListBox.ItemsSource>
                <x:Array Type="sys:String">
                    <sys:String>張三</sys:String>
                    <sys:String>李四</sys:String>
                </x:Array>
            </ListBox.ItemsSource>
        </ListBox>

在解析< x: Array>標(biāo)簽 的 時候編譯器會生成調(diào)用AddChild方法的代碼把< x: Array>標(biāo)簽 的子元素逐個添加到x: Array實(shí)例的Items里。

x:Static

x:Static是用來使用XAML文檔中數(shù)據(jù)類型的靜態(tài)成員押桃。XAML不能編寫邏輯代碼葵萎,所以使用x:Static訪問數(shù)據(jù)類型的靜態(tài)成員一定是屬性字段。引用書中的例子

   public partial class MainWindow : Window
   {
       public static string WindowTitle = "山高月小";
       public static string ShowText { get { return "水落石出"}; }

       public MainWindow()
       {
           InitializeComponent();
       }
   }

然后用x:Static訪問MainWindow.ShowText

<Window x:Class="SamplesForWPF.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:SamplesForWPF"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">
    <StackPanel Background="LightBlue">
        <TextBlock Text="{x:Static local:MainWindow.ShowText}"/>
    </StackPanel>
</Window>
運(yùn)行結(jié)果

XAML指令元素

XAML指令元素只有兩個,x:Code,x:XData羡忘。

x:Code

x:Code作用是可以包含本應(yīng)后置的C#代碼谎痢。

x:XData

x:XData是一個專用標(biāo)簽。數(shù)據(jù)提供者XmlDataProvider的實(shí)例放在x:XData內(nèi)容里卷雕。

引用書中實(shí)例


x:XData
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末节猿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漫雕,更是在濱河造成了極大的恐慌滨嘱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浸间,死亡現(xiàn)場離奇詭異太雨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)魁蒜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門囊扳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兜看,你說我怎么就攤上這事锥咸。” “怎么了细移?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵搏予,是天一觀的道長。 經(jīng)常有香客問我葫哗,道長缔刹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任劣针,我火速辦了婚禮校镐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捺典。我一直安慰自己鸟廓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布襟己。 她就那樣靜靜地躺著引谜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擎浴。 梳的紋絲不亂的頭發(fā)上员咽,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音贮预,去河邊找鬼贝室。 笑死契讲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滑频。 我是一名探鬼主播捡偏,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峡迷!你這毒婦竟也來了银伟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绘搞,失蹤者是張志新(化名)和其女友劉穎彤避,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看杭,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忠藤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年挟伙,在試婚紗的時候發(fā)現(xiàn)自己被綠了楼雹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡尖阔,死狀恐怖贮缅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情介却,我是刑警寧澤谴供,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站齿坷,受9級特大地震影響桂肌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜永淌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一崎场、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遂蛀,春花似錦谭跨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至所坯,卻和暖如春谆扎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芹助。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工堂湖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留籍凝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓苗缩,卻偏偏與公主長得像饵蒂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子酱讶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容