x名稱空間詳解


  第一篇的時間提到過一個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

本程序需要注意四點

  1mlns: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)告訴了我答案。先上代碼了

 

XAML
<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>
CS
        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類(如果是新手可以好好的體會一下關於這個類的設計,我這個菜鳥看了半天,才有那么一點點理解了)。代碼如下:

 

CS
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"/>代碼)如下:

XAML
<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代碼

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>

這樣寫的話會報錯,所以我們利用以前講過屬性標簽。代碼為

XAML
<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的時間花了一下功夫。如果有不足的地方,請大牛們指點。謝謝閱讀!下一篇:控件和布局


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM