• 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的时间花了一下功夫。如果有不足的地方,请大牛们指点。谢谢阅读!下一篇:控件和布局

  • 相关阅读:
    监听手机晃动(摇一摇)SensorEventListener
    adb logcat 命令行用法
    设计模式:观察者模式
    设计模式学习笔记-观察者模式
    Android中Parcelable序列化总结
    2048 Puzzle游戏攻略
    projecteuler----&gt;problem=14----Longest Collatz sequence
    桥模式设计模式进入Bridge
    SessionA和pplication网上聊天室的网络范例
    [ACM] hdu 5045 Contest (减少国家Dp)
  • 原文地址:https://www.cnblogs.com/lzhp/p/2667994.html
Copyright © 2020-2023  润新知