第一篇的時間提到過一個xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml.沒有詳細的去解釋,本文就去記錄一下x的情況。
一、x名稱空間都有什么
有了x,XAML編譯器就會知道XAML怎么解析和編譯,所以關於x命名空間里面的內容都與解析和編譯有關。x名稱空間的主要的內容如下:
1. Attribute類: x:Class, x:ClassModifier, x:FieldModifier, x:Key, x:Name, x: Shared
2.標簽擴展類: x:Array, x:Null, x:Static, x:Type
二、x名稱空間的Attribute
2.1 x:ClassModifier
介紹x:ClassModifier之前還是要說一下X:Class,由於有前者的標簽必須要有后者標簽,因為ClassModifier是用來修飾class的,主要來說明Class的訪問級別,x:class是告訴窗口要編譯成說明類,ClassModifier把類指定為怎么樣的訪問權限。下面看一個例子如圖1:
圖1
接下來看看IL反匯編程序類是以private的訪問權限出現的(程序集的訪問級別internal和private是相同的),如圖2:
圖2 圖3
2.2 x:Name
編譯器把x:Name編譯成類的屬性了,何以得來?下面就來證實一下。如果在一個TextBox標簽里加上 x:Name="textbox1" 再看看IL反匯編程序如圖3。現在終於知道為什么this.textbox1指的是這個控件了。至於x:Name與Name的差別,在於有的控件沒有Name功能,也就是說前者更實用,所以建議都用前者。
2.3 x:FieldModified
x:FieldModified與x:Name的關系和x:ClassModifier與x:Class的關系差不多,都是前者設置后者的訪問級別,並且與有x:Name必須有x:Class保持一致。引用方式為:<Slider x:Name="slider1" Margin="5" x:FieldModifier="public"/> 。由於上面已經說過x:ClassModifier與x:Class的關系,在此不再羅嗦。
2.4 x:Key
在c#中最自然的檢索方式莫過於實用鍵值對“Key-Value”的形式,在XAML中會有使用多次資源,我們如果把資源放到資源字典里,就可以通過Key來檢索出來了。好了還是利用例子更能說明問題,現在把一個string類型的資源放到資源字典里面,通過XAML和.CS兩種形式顯示到文本框里面。現在貼出前台代碼和后台代碼:
<Window x:Class="xNameSpace.xKey" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="xKey" Height="300" Width="300"> <Window.Resources> <sys:String x:Key="myString">Hello WPF!</sys:String> </Window.Resources> <StackPanel> <TextBox Text="{StaticResource ResourceKey=myString}" Margin="5"/> <TextBox x:Name="textBox2" Margin="5"/> <Button Content="Show" Click="Button_Click" Margin="5"/> </StackPanel> </Window>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace xNameSpace { /// <summary> /// xKey.xaml 的交互邏輯 /// </summary> public partial class xKey : Window { public xKey() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { string str=this.FindResource("myString") as string; this.textBox2.Text = str; } } }
運行結果如圖4,點擊按鈕如圖5
圖4 圖5
本程序需要注意四點
1、mlns:sys="clr-namespace:System;assembly=mscorlib"先引出程序命名空間,上面的是string的命名空間。
2、<Window.Resources><sys:String x:Key="myString">Hello WPF!</sys:String></Window.Resources>定義資源並放入資源字典里面。
3、<TextBox Text="{StaticResource ResourceKey=myString}" Margin="5"/>引用資源,這個是一個標簽擴展,其實很簡單,花括號里面前面是類型名,后面是一個屬性=value。
4、string str=this.FindResource("myString") as string;后台找資源的時間是用()不是[],因為這里的FindResource是窗體的方法。
2.5 x:shared
聲明資源是否共享,一定要和x:key配合使用。現在直接給出微軟的官方作用:當設置為 false 時,會修改 WPF 資源檢索行為,以便特性化資源請求為每個請求創建一個新實例,而不是所有請求共享同一個實例。可能讀完感到沒有頭緒,我讀完也不知道是怎么回事,但是網上一查,發現有篇文章(http://www.cnblogs.com/qc1984326/archive/2009/04/28/1445743.html)告訴了我答案。先上代碼了

<Window x:Class="xNameSpace.xShared" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="xShared" Height="300" Width="300"> <Window.Resources> <SolidColorBrush x:Shared="false" x:Key="brush" Color="red" ></SolidColorBrush> </Window.Resources> <Grid x:Name="grid" > <Button Content="變色" Height="23" HorizontalAlignment="Left" Margin="73,156,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="21,44,0,0" Name="button2" VerticalAlignment="Top" Width="75" Background="{StaticResource ResourceKey=brush}"/> <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="137,44,0,0" Name="button3" VerticalAlignment="Top" Width="75" Background="{StaticResource ResourceKey=brush}"/> </Grid> </Window>

private void button1_Click(object sender, RoutedEventArgs e)
{
SolidColorBrush scb = this.button2.Background as SolidColorBrush;
scb.Color=Colors.Green;
}
把x:Shared為false或true,運行兩個按鈕都是紅色的,點變色按鈕分別的效果為:
圖6 圖7
根據我的理解是這樣的如果利用Shared=True的話是共享一個資源,如果改變了button的背景色,那么資源的值也就改變了,如果是為False的話,只會改變自己的顏色,與資源無關了,所以另外一個按鈕就不會改變顏色了。微軟:如果對資源的引用是靜態資源引用,則在 XAML 處理時間之后的資源更改是不相關的。我改變標簽擴展的StaticResource和DynamicResource效果是一樣的,不知道是什么意思,希望有知道的大牛指點一下。
三、x名稱空間的標記擴展
3.1 x:Type
Type本來就是framework里面的表示類型聲明:類類型、接口類型、數組類型、值類型、枚舉類型、類型參數、泛型類型定義,以及開放或封閉構造的泛型類型。還記的標記擴展有個特征是花括號里最左邊的是其類型,x:Type就是一個花括號里的最左邊的一個類。當在標記擴展里面想表達某個類的時間就可以用x:Type,還是通過一個例子說明其用法。需求是單擊主窗體的按鈕,顯示另外一個窗體。由於這個Type是窗體,所以代碼會有點多。先定義個MyButton類,使其繼承Button類(如果是新手可以好好的體會一下關於這個類的設計,我這個菜鳥看了半天,才有那么一點點理解了)。代碼如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Controls; using System.Windows; namespace xNameSpace { public class MyButton : Button { public Type UserWindowType { get; set; } protected override void OnClick() { base.OnClick(); //MessageBox.Show(this.UserWindowType.ToString()); Window win = Activator.CreateInstance(this.UserWindowType) as Window; if (win != null) win.ShowDialog(); } } }
然后再添加一個窗體Mywindow,然后編譯一下,否則可能會在后面找不到MyWindow。最后添加主窗體Window1,后台代碼默認,XAML代碼(注意在開始的時間引入命名空間 xmlns:local="clr-namespace:xNameSpace" ,以及里面的<local:MyButton Content="show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/>代碼)如下:

<Window x:Class="xNameSpace.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:xNameSpace" Title="Window1" Height="300" Width="300"> <StackPanel> <local:MyButton Content="show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/> </StackPanel> </Window>
單擊Window1上的按鈕就可以顯示新建的窗體了。
3.2 x:null
主要在設置style時用的比較多,定義指定的風格后,想讓某一個控件不適用次風格的話就可以用x:null。看一個例子,本例也有用到x:Type,順便復習一下上面的內容。XAML代碼

1 <Window x:Class="xNameSpace.xNull" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="xNull" Height="300" Width="300"> 5 <Window.Resources> 6 <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}"> 7 <Setter Property="Width" Value="60"/> 8 <Setter Property="Height" Value="36"/> 9 <Setter Property="Margin" Value="5"/> 10 <Setter Property="Background" Value="Red"/> 11 </Style> 12 </Window.Resources> 13 <StackPanel> 14 <Button Content="OK"></Button> 15 <Button Content="OK"></Button> 16 <Button Style="{x:Null}" Content="OK"></Button> 17 </StackPanel> 18 </Window>
運行結果:
圖 8
Style的章節還會用到,在此只是簡單的適用一下。
3.3 x:Array
經過了上面的例子應該可以猜出x:Array標簽類型是數組,在綁定listbox時間可以做其數據源。
<ListBox Margin="5"> <ListBox.ItemsSource="{x:Array}" </ListBox>
這樣寫的話會報錯,所以我們利用以前講過屬性標簽。代碼為

<Window x:Class="xNameSpace.xArray" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="xArray" Height="300" Width="300"> <Grid> <ListBox Margin="5"> <ListBox.ItemsSource> <x:Array Type="sys:String"> <sys:String>我是listbox</sys:String> <sys:String>我是來測試x:Array的</sys:String> </x:Array> </ListBox.ItemsSource> </ListBox> </Grid> </Window>
效果圖如圖9:
圖 9
3.4 x:Static
x:Static是一個很常見的標簽擴展,它的功能是在XAML文檔中使用數據類型的Static成員。在后台添加一個靜態變量:public static string staticStr = "我是靜態變量"; ,在XAML中引用本地程序集:xmlns:local="clr-namespace:xNameSpace", 然后在textbox里面顯示靜態變量的值,代碼為<TextBox Text="{x:Static local:xStatic.staticStr}"/>,其中xStatic為窗體名字。最后顯示結果如圖10:
圖10
四、總結
本文主要記錄了x命名空間里的兩大類(Attribute類和標記擴展類)主要的內容,根據情況去選擇使用,想熟練的使用還需要一段時間的練習,主要難點在於記住各個功能的格式和使用場合。還有就是在理解x:Shared的時間花了一下功夫。如果有不足的地方,請大牛們指點。謝謝閱讀!下一篇:控件和布局