• WPF中的X命名空间


    x是xaml名称空间的简称,映射的是http://schemas.microsoft.com/winfx/2006/xaml

    与C#一样,XAML也有自己独立的编译器。XAML会被解析和编译,最终形成微软的中间语言存储在程序集中。在解析和编译XAML的语言过程中,我们经常需要告诉编译器一些重要的信息,比如XAML代码的编译结果应该与哪个C#代码的编译器合并、使用XAML声明的元素师public还是private访问级别等等。这些让程序员能够与XAML编译器沟通的工具就存在x名称空间中。

      在x名称空间下包含三种类型的工具:

           一、Attribute类型的工具

           二、标签扩展类型的工具

           三、XAML指令元素类型的工具

    一、x名称空间中的Attribue

         提到Attribute,不由的想起我学习编程的时候,属性这个概念,在英文的技术文章中存在Attribute和Property这两个概念,用中文翻译都可以译为“属性”。既然都为“属性”那么它们之间有什么区别呢?通过查阅资料,有这样的解释:Attribute和Property是两个层面的东西,Attribute是语言层面上的东西,是给编译器看的,而Property是面向对象层面上的东西,是给编程逻辑用的。对于两者更贴切的翻译应该是Atrribute被译为“特征”,而Property被译为属性。好了,我们还是来看看x名称空间中的Attribute。

      1、x:Class 这个Attribute的作用是告诉XAML编译器将XMAL标签的编译结果与后台代码中指定的类合并。使用该Attribute必须遵循一些要求:

      •             该Atrribute只能用于xaml的根节点中
      •             使用x:Class的根节点的类型要与x:Class的值所指示的类型保持一致
    •             x:Class的值所指示的类型在声明时必须使用partial关键字

      2、x:ClassModifier 这个Attribute的作用是告诉XAML编译器生成的类是有什么样的访问修饰符修饰的。在使用该Attribute的时候必须注意:

      • 使用该Attribute的标签必须具有x:Class Attribute
      • x:ClassModifier的值必须与x:Class的值所指示的类型的访问修饰符保持一致

      比如你在xaml代码中的Window标签中使用了x:ClassModifier="public",那么首先该标签中必须存在x:Class=""这样的Attribute-Value。同时xaml对应的cs代码这个类必须也是public的。

      3、x:Name  关于这个Attribtue,我给它的定义就相当于一个人的名字,用于区分。举这样一个例子吧!如果现实生活中,一位老师第一次到一个班去上课,此时她没有同学们的资料,这样你能分别出各位同学吗?如果老师有同学们的资料,那么老师可以根据念姓名来找到对应的同学,那x:Name就有这样的作用了!

           x:Name的作用有两个:

      • 告诉XAML编译器,当一个标签带有x:Name属性时,除了为这个标签生成对应的实例外还为这个实例声明一个引用变量,变量名就是x:Name的值
      • 如果设置了x:Name的标签具有Name的属性,那么将Name属性的值设为x:Name的值,并把这个值注册到UI树上,以达到方便查找的目的

      4、x:FieldModifier 关于这个Attribute,是用来设置引用变量的访问修饰符的。但是必须在使用了x:Name的标签中使用x:FieldModifier属性。因为x:FieldModifier对应的值是为x:Name所生成的引用变量设置访问修饰符的。

      5、x:Key 在任何的xaml中我们都可以定义Resource,我们可以提取一些内容放置在Resource中,当然每种内容都必须有自己独特的标识,那x:Key就是这个作用了,在使用某种内容时,我们就可以根据x:Key 来检索对应的资源了。

      6、x:Shared  在利用Attribute x:Key检索对象时,都会得到一个对象,如果所检索的对象未使用x:Shared标签,那么第一次检索对象时得到一个对象,当第二次使用时那么只能得到第一次检索对象的一个副本。不断的使用同一检索对象,在内存中副本就会增加,同时也加大了内存的消耗。如果所检索的对象中使用了x:Shared="true"标签,那么不管重复使用多次所检索的对象,都是使用的同一个对象。这就减少了内存的消耗了!

    •  二、x名称空间中的标记扩展

         标记扩展(Markup Extension)实际上就是一些MarkupExtension类直接或者间接的派生类,在x名称空间中就存在这样一些类,所以常称它们为x名称空间内的标记扩展。

      下面我们来看一下常用的标记扩展吧!

      1、x:Type 从字面上开,x:Type的值应该是一个数据类型的名称。一般情况下,我们在编程中操作的是数据类型的实例或者是实例的引用,但是有时候我们也会用到数据类型本身。下面我们还是来看一个例子吧!

           首先创建一个Button的派生类:

           class MyButton:Button

          {

                 public Type UserWindowType {get; set; }

                 protected override void OnClick(

                {

                       base.OnClick();

                       Window win = Activator.CreateInstance(this.UserWindowType) as Window;

                       if(win != null)

                              win.ShowDialog();

                }

      在该类中存在一个Type类型的属性,即UserWindowType,此时你需要将一种数据类型当做值赋给它。同时在该类中重写了父类的OnClick方法,此时可以像父类那样激活Click时间,还会创建UserWindowType所存储类型的一个实例。

      <Window x:Class="WpfApplication.Window1"

                        xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation

                        xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml

                        Title="Window1" Width="200" Height="170">

                        <StackPanel Background="LightBlue">

                                        <TextBox />

                                        <TextBox />

                                        <Button Content="确认" />

                        </StackPanel>

       </Window>

      此时,我们将自定义按钮添加到窗口中,并且把Window1作为数据类型复制给自定义按钮的UserWindowType属性。

      <Window x:Class="WpfApplication.Window2"

                        xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation

                        xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml

                        Title="Window2" Width="300" Height="300">

                        <StackPanel>

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

                        </StackPanel>

       </Window>

      这就是x:Type的用法了!

      2、x:Null 该标记扩展的作用是将一个空值显示的赋给一个属性。我们知道在C#中用null表示空值,那么在xaml中就用x:Null表示空值了。同样让我们来看一个例子:

      <Window.Resource>

      <Style TargetType="Button">

              <Setter Property="Background" Value="LightBlue" />

      </Style>

      </Window.Resource>

      <StackPanel>

      <Button Content="Button1" />

      <Button Content="Button2" />

      <Button Content="Button3"/>

      <Button Content="Button4" Style="{x:Null}" />

      </StackPanel>

      以上代码的运行效果是,前三个Button的背景色均为浅蓝色,而最后一个button为默认颜色。知道x:Null的用法了吧!

      3、x:Array 该Attribute的作用就是通过它的Items属性向使用者报了一个类型已知的ArrayList实例,ArrayList内成员的类型有x:Array的Type指明。下面我们一个例子来说明吧!

      <ListBox>

      <ListBox.ItemsSource>

      <x:Array Type="sys:String">

      <sys:String>1</sys:String>

      <sys:String>2</sys:String>

      <sys:String>3</sys:String>

      </x:Array>

      </ListBox.ItemsSource>

      </ListBox>

      运行程序,你就知道效果了!

      4、x:Static 是一个很常用的标记扩展,它的主要作用是使用数据类型中的Static成员。主要用于程序的国际化支持了。同样用例子说话:

      public class Chinese

      {

            public static string btnSure = "确认";

      }

      public class English

      {

           public static string btnSure = "OK";

      }

      根据选择不同的语言,使其展现内容的语言不同

      <Button Content="{x:Static ocal:Chinese.btnSure}"

      三、XAML指令元素

      x:Code 主要用于在xaml中写入C#代码

  • 相关阅读:
    Linux网络检测手段汇总
    Hadoop单机搭建
    Nginx之Location模块
    关于STM32驱动DS1302实时时钟的一点思考
    灵感手环第一步——0.96寸OLED显示实验
    把简单做到极致
    KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data
    关于SPI通信原理与程序实现
    【转载】keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因
    关于keil5使用注意事项(预定义、路径包含)
  • 原文地址:https://www.cnblogs.com/happinesshappy/p/4606245.html
Copyright © 2020-2023  润新知