1. 程式人生 > >WPF學習筆記(2)——x名稱空間詳解 上

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中的引用會是:
   xmlns:common="clr-namespace:Common;assembly=MyLibrary"
   xmlns:controls="clr-namespace:Controls;assembly=MyLibrary"
使用Common和Controls中的類,程式碼是這樣:
   <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"