筆記簡述
- 閑話
- x名稱空間簡要
- x名稱空間的Attribute
- x名稱空間的標簽擴展
- x名稱空間的XAML指令元素
?
閑話
本筆記參考與《深入淺出WPF》、MSDN、Some Blog…
MSDN的飛機票點這里。
x名稱空間簡要
在VS中新建個WpfApplication都會自動生成xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"這么句話,這就是x名稱空間了。它包含的類均與解析XAML語言相關。
一下列出x名稱空間中包含的工具:
名稱 種類 x:Array 標簽擴展 x:Class Attribute x:ClassModifier Attribute x:Code XAML指令元素 x:FieldModifier Attribute x:Key Attribute x:Name Attribute x:Null 標簽擴展 x:Share Attribute x:Static 標簽擴展 x:SubClass Attribute x:Type 標簽擴展 x:TypeArguments Attribute x:Uid Attribute x:XData XAML指令元素 ?
x名稱空間的Attribute
x:Class
新建的WpfApplication中會有這樣的XAML語句:x:Class="WpfApplication.MainWindow"。這是告訴XAML編譯器編譯的結果需要與后臺中的Namespace為WpfApplication和MainWindow-Class結合。
使用x:class要求如下:
- x:class只能用于根節點;
- x:class的根節點的類型要與具體的值類型一致;
- x:class的值的類型聲明時必須使用partial關鍵字。
x:ClassModifier
在創建x:class時候,使用x:ClassModifier可以顯示修改XAML編譯行為,告訴生成的類具有怎么樣的訪問控制級別。默認值為Public。
用法:
<object x:Class="namespace.classname" x:ClassModifier="NotPublic">...</object>
x:Name
首先,必須了解的是XAML是一種聲明式語言,XAML標簽聲明的是對象,對象一般就是控件的實例。在.NET中,一般實例會對應一個引用變量,x:Name就起到了這樣的作用。x:Name還有個作用,就是將XAML標簽對應的對象Name屬性(有的話)也設為x:Name的值。
根據上訴總結,x:Name兩個作用:
- 為XAML標簽聲明的實例聲明一個引用變量。
- 將XAML標簽對應的對象的Name屬相設為x:Name的值。
Coding一個:
[XMAL]
<StackPanel Margin="10">
<TextBox x:Name="LiLinsTextBox" Margin="5" Width="100"></TextBox><Button Content="OK" Click="Button_Click" Width="80"></Button></StackPanel>?
[cs]
private void Button_Click(object sender, RoutedEventArgs e){if (string.IsNullOrEmpty(LiLinsTextBox.Name)){MessageBox.Show("No Name");
}else
{MessageBox.Show(LiLinsTextBox.Name);}}?
RUN:
x:FieldModifier
上述中用x:Name聲明了引用變量了,既然是變量,那難免會要設置下訪問級別。與C#一樣,這些變量默認為internal。假如你想跨程序集去訪問窗口中元素,這時需要把改窗口元素的引用變量訪問級別聲明了public。這就用到了x:FieldModifier。
使用方法:(使用前提:存在引用變量,即需要有x:Name。不然沒有引用變量咋引用~\(≧▽≦)/~啦啦啦)
<TextBox x:Name="LiLinsTextBox" Margin="5" Width="100" x:FieldModifier="public"></TextBox>
x:Key
看到Key第一眼就想到Key-Value對的形式了。Key的作用就是為資源貼上檢索的索引。
用Coding說話:
<Window.Resources><sys:String x:Key="myKey">LiLin is learning WPF.</sys:String></Window.Resources><StackPanel Margin="10">
<TextBox Margin="5" Width="120" Text="{StaticResource myKey}"></TextBox><TextBox Margin="5" Width="120" x:Name="btn"></TextBox><Button Content="OK" Click="Button_Click" Width="80"></Button></StackPanel>?
還可以在C#中訪問資源:
private void Button_Click(object sender, RoutedEventArgs e){btn.Text = this.FindResource("myKey") as string;}?
Run:
?
x:Share
x:Share與x:Key結合使用。使用x:Key時是否有這樣的疑惑,用Key去多次檢索資源中的對象,是否為同一個對象。這時就要x:Share決定了。
當x:Share的值為false時,每次用x:Key去檢索這個對象都是不同的,都是這個對象的新副本;設為true,則每次檢索到同一個。默認值為true。
x名稱空間中的標記擴展
x:Type
x:Type的值應該是一個Type的名稱。Type,是指C#中所有數據類型在編程層面上的抽象。當需要在XAML中想表達某個數據類型是就需要用到x:Type了。
Coding:
假設mainWindow中的自定義Button點擊想彈出一個自定義的窗口:
先自定義個Button:
public class myButton : Button{public Type MyWindowType { get; set; }
?protected override void OnClick(){base.OnClick();
Window win = Activator.CreateInstance(this.MyWindowType) as Window;if (win != null){win.ShowDialog();}}}
接著,新建個Window:
<StackPanel Background="AliceBlue" >
<TextBox Width="100" Margin="5"></TextBox><TextBox Width="100" Margin="5"></TextBox><TextBox Width="100" Margin="5"></TextBox></StackPanel>?
最后在mainWindow中定義自定義Button的實例:
<StackPanel Margin="10">
<local:myButton Content="Show" Margin="30" MyWindowType="{x:Type TypeName=local:myWindow}"></local:myButton></StackPanel>?
Run:
x:Null
類似于C#中的Null,唯一區別就是x:Null用于XAML中吧。
Coding:
<Window.Resources><Style x:Key="{x:Type Button}" TargetType="{x:Type Button}"><Setter Property="Width" Value="50"></Setter><Setter Property="Margin" Value="5"/><Setter Property="Height" Value="20"></Setter></Style></Window.Resources><StackPanel Margin="10">
<Button Content="Not Null"></Button>
<Button Content="Not Null"></Button>
<Button Content="Null" Style="{x:Null}"></Button></StackPanel>?
Run:
x:Array
x:Array是一個類型已知的ArrayList,ArrayList的類型是有x:Array的Type屬性確定。
例子:
<Grid Background="LightBlue">
<ListBox Margin="5">
<ListBox.ItemsSource><x:Array Type="sys:String">
<sys:String>LiLin</sys:String><sys:String>Tim</sys:String><sys:String>Tom</sys:String></x:Array></ListBox.ItemsSource></ListBox></Grid>?
x:Static
x:Static作用是使用數據類型中的static成員。
例子:
?
XAML的指令元素
XAML的指令元素有兩個
- x:Code
- x:XData
x:Code的壞處是講C#的代碼寫到XAML中來,個人認為不是好處哈。
x:XData是用在:在XAML中使用數據提供者(如XmlDataProvider)提供數據時。
?
以上較詳細的將XAML中的x名稱空間介紹完了…