WPF之X名稱空間學習


WPF的X名稱空間都有什么呢?首先,盜用張圖來說明:

我將就圖表中的內容進行總結:

1、x:Array具有一個Iteams屬性,它能暴漏一個ArratList實例,ArratList實例的內部成員類型由x:Array的Type指明。

<Window x:Class="X名稱空間詳解.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"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:X名稱空間詳解"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid Background="LightBlue">
        <ListBox FontSize="20" Margin="20">
            <ListBox.ItemsSource>
                <x:Array Type="sys:String">
                    <sys:String>jack</sys:String>
                    <sys:String>joson</sys:String>
                    <sys:String>tom</sys:String>
                </x:Array>
            </ListBox.ItemsSource>
        </ListBox>
    </Grid>
</Window>

2、x:Class的作用是告訴XAML編譯器將XAML標簽的編譯結果與后台c#代碼合並,所以C#代碼中有了partial。

3、x:ClassModifier的作用是告訴XAML編譯器標簽編譯生成的類具有怎樣的訪問級別。給<Window>標簽加上x:ClassModifier="internal"。直接編譯會產生編譯錯誤,需要找到C#代碼將標簽對應合並的類的訪問控制級別由public改成internal。

4、x:Code的作用是可以將c#代碼放在前置的XAML代碼中。

<Window x:Class="X名稱空間詳解.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"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:X名稱空間詳解"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid Background="LightBlue">
        <Button Width="100" Height="30" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5,20,0,0" Click="Button_Click"></Button>
    </Grid>
    <x:Code>
        <![CDATA[
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("happy new year!");
        }
        ]]>
    </x:Code>
</Window>

5、x:FieldModifier、x:Name、x:Key

x:FieldModifier與x:Name用在標簽里,x:Name表示控件的引用。有了x:Name,就可以在c#代碼中直接獲取控件,如textBox1.Text就能獲取到textBox1的值,x:FieldModifier表示控件的引用變量的訪問級別。在默認情況下,這些控件的x:FieldModifier被封裝成internal,下面將textBox1的x:FieldModifier設置成public后可以在另一個程序集中引用這個控件元素。

在MainWindow的添加了一個string條目,並用x:key標記,這樣可以在XAML和c#代碼中多次使用這個字符串。

XAML中使用Text="{StaticResource ResourceKey=myString}"

   c#代碼中使用string str = this.FindResource("myString") as string;

<Window x:Class="X名稱空間詳解.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"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:X名稱空間詳解"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <sys:String x:Key="myString">Hello world</sys:String>
    </Window.Resources>
    <Grid Background="LightBlue">
        <TextBox x:Name="textBox1" x:FieldModifier="public" HorizontalAlignment="Left" Width="100" Height="30">hello</TextBox>
        <TextBox x:Name="textBox2" Text="{StaticResource ResourceKey=myString}" HorizontalAlignment="Right" Width="100" Height="30"></TextBox>
    </Grid>
</Window>

6、x:Shared。。學習x:key的時候我們已經了解到,如果把某個對象作為資源放入資源字典里后我們就可以把它們檢索起來重復使用。那么每當我們檢索到一個對象,我們得到的究竟是同一個對象呢,還是這個對像的一個副本呢?這就要看我們為x:Shared賦什么值了。x:Shared一定要與x:Key配合使用,如果x:Shared值為true,那么每次檢索這個對象的時候,我們得到的都是同一個對象,反之,我們得到的就是這個對象的一個副本。默認這個值是true。也就是說我們使用的都是同一個對象。

7、x:Type的值應該是一個數據類型的名稱,Type是對數據類型的抽象,例如一個類、string、int、結構、枚舉等都是數據類型。當在XAML中想表達某個數據類型的時候就需要使用x:Type標記擴展了。

首先,創建一個窗體

<Window x:Class="X名稱空間詳解.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:X名稱空間詳解"
        mc:Ignorable="d"
        Title="Window1" Height="300" Width="300">
    <StackPanel Background="LightBlue">
        <TextBox Margin="20"></TextBox>
        <TextBox Margin="20"></TextBox>
        <TextBox Margin="20"></TextBox>
        <Button Content="ok" Margin="20"/>
    </StackPanel>
</Window>

然后創建一個MyButton類,繼承自Button,如果UserWindowType在類初始化的時候賦了上面的窗體,那么觸發MyButton的click事件時會彈出上面的窗體。

    class MyButton : Button
    {
        public Type UserWindowType { get; set; }
        protected override void OnClick()
        {
            base.OnClick();//激發click事件
            Window win1 = Activator.CreateInstance(this.UserWindowType) as Window;
            if (win1 != null)
            {
                win1.ShowDialog();
            }
        }
    }

最后在主窗體的XAML中使用,下面的x:Type 就起到了指明UserWindowType的數據類型的作用。單擊這個MyButton就會跳出Window1窗體。

<local:MyButton  Content="Show" UserWindowType="{x:Type TypeName=local:Window1}" Width="100" Height="30"></local:MyButton>

8、x:Null與x:Type

這里講到x:Null,並再次提到x:Type,加深對x:Type的理解。

null用來表示空值,x:Null用來在XAML中表示空值。

<Window x:Class="X名稱空間詳解.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:X名稱空間詳解"
        mc:Ignorable="d"
        Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
            <Setter Property="Height"  Value="50"></Setter>
        </Style>
    </Window.Resources>
    <StackPanel Background="LightBlue">
        <TextBox Margin="20" Height="30"></TextBox>
        <TextBox Margin="20"></TextBox>
        <TextBox Margin="20" Style="{x:Null}"></TextBox>
        <Button Content="ok" Margin="20"/>
    </StackPanel>
</Window>

9、x:Static

這是一個很常用的標記擴展,它的作用是在XAML文檔中使用數據類型為static的成員。因為XAML不能編寫邏輯代碼。所以使用x:Static訪問的static成員一定是數據類型的屬性和字段。我們看如下一些例子:

  1. public Window4()  
  2.        {  
  3.            InitializeComponent();  
  4.        }  
  5.   
  6.        public static string Test = "明月松間照,清泉石上流。";  
 
 
  1. <Window x:Class="WpfApplication2.Window4"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         xmlns:sys="clr-namespace:System;assembly=mscorlib"  
  5.         xmlns:local="clr-namespace:WpfApplication2"  
  6.         Title="Window4" Height="369" Width="675">  
  7.    <Grid>  
  8.         <Button Content="{x:Static local:Window4.Test}" Height="23" HorizontalAlignment="Left" Margin="128,12,0,0" Name="button3" VerticalAlignment="Top" Style="{x:Null}"/>  
  9.     </Grid>  
  10. </Window>  

10、x:XData

x:XData是一個專用標簽。WPF把包含數據的對象稱為數據源,用於把數據源中的數據提供給數據使用者的對象被稱做是數據提供者,WPF中包含多種數據提供者,其中一個類名叫做XmlDataProvider實例,那么XmlDataProvider實例的數據就要放在x:XData的標簽內容里。事例如下:

 

說明:這篇博文主要參考劉鐵猛先生的深入淺出wpf書籍。。。


免責聲明!

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



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