WPF學習筆記(2)——x名稱空間詳解 上
先說一些基本的, .NET的模組稱為程式集(Assembly)。一般情況下,用VS建立的是解決方案(Solution),一個解決方案就是一個完整的程式。解決方案中包含若干個專案
(Project),每個專案是可以獨立編譯的,他的編譯結果是一個程式集。常見的程式集是以.exe為副檔名的可執行程式或者是以.dll為副檔名的動態連結庫,大多數情況下,我們
說“引用其他程式集”的時候,說的是動態連結庫。因為.NET程式設計介面(Application Programming Interface, API)以類和類級別的單元為主,所以我們又常把引用程式集說成是引
用類庫。名稱空間的作用是避免同名類的衝突。比如一個程式中引用了LibA.dll和LibB.dll兩個類庫,這兩個類庫中都有一個叫Converter的類,若沒有名稱空間來限定,編譯器可能
會弄混。應用名稱空間,把LibA.dll中的Converter放在一個名為Microsoft的名稱空間,LibB.dll中的Converter放在名為Google名稱空間裡,就可以用Microsoft.Converter和
Google.Converter來區分這兩個類了。
假設類庫程式集名為MyLibrary.dll,其中包含Common和Controls兩個名稱空間,且已經將其引用進WPF專案,那麼在XAML中引用這兩個名稱空間的語法是:
xmlns:對映名=“clr-namespace:類庫中名稱空間的名字;assembly=類庫檔名”
對於MyLibrary.dll裡的兩個名稱空間,XAML中的引用會是:
使用Common和Controls中的類,程式碼是這樣:xmlns:common="clr-namespace:Common;assembly=MyLibrary" xmlns:controls="clr-namespace:Controls;assembly=MyLibrary"
<common:MessagePanel x:Name="window1"/>
<controls:LedButton x:Name="button1"/>
在C#中引用Common和Controls名稱空間時可以如下所寫:
using Cmn=Common;
using Ctl=Controls;
x名稱空間對映的是 http://schemas.microsoft.com/winfx/2006/xaml,亦可稱為"XAML名稱空間"。其裡面主要分為三類:Attribute,標記擴充套件和XAML指令元素。
x名稱空間中的Attribute
1. x:Class
這個Attribute 的作用是告訴XAML編譯器將XAML標籤的編譯結果與後臺程式碼中指定的類合併。使用時的要求:
這個Attribute只用於根結點;使用x:Class的根結點型別與x:Class的值所指示的型別保持一致;x:Class的值所指示的型別在宣告時必須用partial關鍵字
注意:x:ClassModifier的值必須與x:Class所指示類的訪問控制級別一致。若XAML文件中 x:ClassModifier="internal" ,編譯器會報錯,因為實際上在C#中定義的級別是public.
在C#中,private與internal等價
2. x:Name
作用有兩個:
告訴XAML編譯器,當一個標籤帶有x:Name時,除了為這個標籤生產對應例項外還要為這個例項宣告一個引用變數,變數名就是x:Name的值;
將XAML標籤所對應物件的Name屬性(如果有)也改為x:Name的值,並把這個值註冊到UI樹上,以方便查詢。
3. x:FieldModifier
預設情況下,欄位的訪問級別按照面向物件的封裝原則被設定成了 internal. 在程式設計時,有時候我們需要從一個程式集訪問另一個程式集中窗體的元素。這時需要把被訪問控制元件的引用變數改為public級別,x:FieldModifier就是用來在XAML裡改變引用變數訪問級別的,如:
<StackPanel>
<TextBox x:Name="textBox1" x:FieldModifier="public" Margin="5"/>
<TextBox x:Name="textBox2" Margin="5"/>
</StaclPanel>
用IL得子段textBox1級別為public ,而子段textBox2為internal (assembly class)4. x:Key
作用就是為資源貼上用於檢索的索引
<Window x:Class="Wpftest.MainWindow"
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="MainWindow" Height="500" Width="900">
<Window.Resources>
<sys:String x:Key="myString">Hello WPF Resource!</sys:String>
</Window.Resources>
<StackPanel Background="Gray">
<TextBox Text="{StaticResource ResourceKey=myString}" Margin="5"/>
<TextBox x:Name="textBox1" Margin="5"/>
<Button Content="Show" Click="Button_Click" Margin="5"/>
</StackPanel>
</Window>
namespace Wpftest
{
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string str = this.FindResource("myString") as string;
this.textBox1.Text = str;
}
}
}
5. x:Shared
一定與x:Key 配合使用。若x:Shared的值為true, 那麼每次檢索到這個物件時,我們得到的都是同一個物件,否則若x:Shared的值為false. 每次我們檢索到這個物件時,我們得到
的都是這個物件的一個新副本。XAML編譯器會為該資源隱藏地新增 x:Shared="true"