WPF XAML X名称空间详解

WPF XAML X名称空间详解X 名称空间里面的成员 如 X Name X Class 都是写给 XAML 编译器看的 用来引导 XAML 编译器将 XAML 代码编译为 CLR 代码 X 名称空间里面到底都有些什么 nbsp nbsp x 名称空间映射的是 http schemas microsoft com winfx 2006 xaml 望文生义 它包含的类均与解析 XAML 语言相关 所以亦称之为 XAML 名称空间

X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML编译器将XAML代码编译为CLR代码


【X名称空间里面到底都有些什么】



    x名称空间映射的是:http://schemas.microsoft.com/winfx/2006/xaml,望文生义,它包含的类均与解析XAML语言相关,所以亦称之为“XAML名称空间”。


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


WPF XAML X名称空间详解WPF XAML X名称空间详解



    我们注意到,它分为Attribute、标签扩展、XAML指令元素三个种类。下面我们讲讲它们的具体用法:



【X名称空间中的Attribute】


    前面我们已经讲过,Attribute和Property是两个层面上的东西,Attribute是语言层面上的东西,是给编译器看的,Property是面向对象层面上的东西,是给编程逻辑看。而且一个标签中的Attribute大部分对应对象的Property。在使用XAML编程的时候,如果你想给它加一点特殊的标记来改变XAML对它的解析,这时候就需要额外的给它添加一些Attribute了。比如,你想告诉XAML编译器将哪个编译结果和那个C#编译的类合并,这时候就必须为这个标签添加X:Class  Attribute来告诉编译器。X:Class并不是对象成员,而是从X名称空间里拿出来硬贴上去的。让我们浏览一下常用的Attribute。



【x:Class】
    这个Attribute是告诉XAML编译器将XAML编译器编译的结果和后台编译结果的哪一个类进行合并


使用x:Class有以下几点要求:


这个Attribute只能用于根节点。
使用x:Class的根节点的类型要与x:Class的值所指示的一致。
x:Class的值所指示的类型在声明的时候必须使用partial关键字。
x:Class已经在剖析最简单的XAML的时候已经讲过,在这就不多讲了。








 【X:ClassModiffier】
    是告诉XAML编译器由标签编译成的类具有什么样的访问级别






使用这个Attribute的时候需要注意的是:
标签必须具有x:Class Attribute。
X:ClassModiffier的值必须与X:Class所指定类的访问权限一致。
X:ClassModiffier的值随后台代码编译语言的不同而有所不同。








例子:

 
  


对应的C#代码:

///  /// wnd422.xaml 的交互逻辑 ///  internal partial class wnd422 : Window { public wnd422() { InitializeComponent(); } 

WPF XAML X名称空间详解

【X:Name】
    我们之前已经提过XAML是一种声明式语言,但你是否想过XAML标签声明的是什么呢?其实,XAML标签声明的是对象,一个XAML标签对应着一个对象,这个对象一般是一个控件类的实例。在.NET平台上,类是引用类型。引用类型的实例一般都是以“引用者—实例”的形式成对出现的,而且我们只能通过引用者来访问实例。当一个实例不在被任何引用者引用的时候,它将作为内存垃圾被销毁。常见的引用者是引用变量,但不是唯一的。





X:Name的作用有两个:
(1)告诉编译器,当一个标签带有x:Name时,除了为这个标签生成实例还要给这个标签声明一个引用变量,变量名就是x:Name的值。
(2)将XAML标签所对应的Name属性(如果有)也设置为x:Name值,并把这个值注册到UI树上,以方便查找。







【x:FieldModifier】
    使用了x:Name后,XAML标签对应的实例就具有了自己的引用变量,而且这些引用变量都是类的字段,既然这样就不免要关注一下它的访问级别。默认情况下这些字段的级别都被设置成了Internal。在编程的时候,有的时候需要用一个程序集里的一个窗体元素访问到另一个程序集的窗体元素,那么就需要使用x:FieldModifier来改变引用变量的访问级别






    因为x:FidleModifier是引用变量的访问级别,所以要配合x:Name一起使用。否则没有引用变量,何来引用变量访问级别。



例如:

 
   
    
     
     
    
  

对应的C#后台代码:

public partial class wnd423 : Window { public wnd423() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { if(string.IsNullOrEmpty(_txtBox.Name)) { _txtBox.Text = "No Name"; } else { _txtBox.Text = _txtBox.Name; } } } 

WPF XAML X名称空间详解

【x:Key】
     最自然的检索方式莫过于”key-value“的形式了。在XAML文件中,我们可以把需要多次使用的内容提取出来放在资源字典中,需要使用的时候就用这个资源的key将这个资源检索出来。






    x:key的作用就是为资源贴上用于检索的索引。在WPF中,几乎每个元素都有自己的Resource属性,这个属性就是“key-value”的集合。只要把元素放进这个集合里,这个元素就成了资源字典中的一个条目。当然,为了能检索到这个条件,就必须为它添加x:Key。资源在WPF中非常重要,需要重复使用的XAML内容,如Style,各种Template和动画都需要放在资源里。
先让我们看XAML代码:


     
  
     
     
     
     
      
       
       
         Hello WPF Resources 
        
       
       
        
        
        
       
     

    资源不但可以在XAML中使用,也可以在C#中访问,C#中使用如下方式:

_txtBox2.Text = this.FindResource("myString") as string;

【x:Shared】
    学习x:key的时候我们已经了解到,如果把某个对象作为资源放入资源字典里后我们就可以把它们检索起来重复使用。那么每当我们检索到一个对象,我们得到的究竟是同一个对象呢,还是这个对像的一个副本呢?这就要看我们为x:Shared赋什么值了。

    x:Shared一定要与x:Key配合使用,如果x:Shared值为true,那么每次检索这个对象的时候,我们得到的都是同一个对象,反之,我们得到的就是这个对象的一个副本。默认这个值是true。也就是说我们使用的都是同一个对象。



【x名称空间下的扩展标签】
    标记扩展实际就是一些MarkupExtension类的直接或间接派生类。x名称空间中就包含一些这样的类,所以称其为x名称空间标签的标记扩展。





【x:Type】
    顾名思义,x:Type应该是一个数据类型的名称。一般情况下,我们在编程中操作的数据类型实例或者实例的引用。但有的时候我们也需要用到数据类型本身。






    能让程序员在编程的层面上自由的操作这些数据类型,比如在不知道具体类型的情况下创建这个类型的实例并尝试调用它的方法,.NET命名空间里还包含了名为Type的类作为所有数据类型在编程层面上的抽象。




    当我们想在XAML中表达某一数据类型就需要用到x:Type标记扩展。比如某个类的一个属性,它的值要求的是一个数据类型,当我们在XAML中为这个属性赋值是就需要用到x:Type。请看下面这个例子:



我们先定义一个C#的MyButton:

class MyButton : Button
{
    public Type UserWndType { get; set; }

    protected override void OnClick()
    {
        base.OnClick();

        Window wnd = Activator.CreateInstance(UserWndType) as Window;
        if (wnd != null)
            wnd.ShowDialog();
    }
};

再创建一个名为wnd425的Window


在创建一个Window:


         
  
         
         
         
         
          
           
            
           
         


则运行结果如下:点击Ok时,弹出新的创建的wnd425的对话框。
WPF XAML X名称空间详解


【x:Null】
    在XAML里面表示空值就是x:Null。






    大部分时间我们不需要为属性附一个Null值,但如果一个属性有默认值而我们有不需要这个默认值就需要用的null值了。在WPF中,Style是按照一个特定的审美规格设置控件的各个属性,程序员可以为控件逐个设置style,也可以指定一个style目标控件类型,一旦指定了目标类型,所有的这类控件都将使用这个style—-除非你显示的将某个实例的Style设置为null。




请看下面的事例:


            
  
            
            
            
            
             
              
               
              
              
               
               
               
               
              
            

WPF XAML X名称空间详解

【x:Array】
    通过它的item属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型由x:Array的Type指明。下面这个例子就是把ArrayList做为数据源向一个ListBox提供数据:





由于x:Array的Items属性是只读的,所以只能通过标签声明语法添加数据值:


               
  
               
               
               
               
                
                 
                  
                   
                   
                     Tim 
                    
                   
                     Tom 
                    
                   
                     Victor 
                    
                   
                  
                 
               

WPF XAML X名称空间详解


【x:Static】
    这是一个很常用的标记扩展,它的作用是在XAML文档中使用数据类型为static的成员。因为XAML不能编写逻辑代码。所以使用x:Static访问的static成员一定是数据类型的属性和字段。





    如果一个程序需要支持国际化,一般需要把显示的字符串保存在一个资源类的Static属性中,所以支持国际化的程序UI中对x:Static的使用相当的频繁。



【XAML指令元素】
XAML指令元素只有两个:
x:Code 
x:XData







    我们之前已经在代码后置一节介绍过x:Code标签,它的作用是可以在XAML文档中编写后置的C#后台逻辑代码,这样做的好处就是不需要把XAML和C#分放在两个文档中,这样写的问题是代码不容易维护,不宜调试,一般没有人愿意这么干。






    x:XData是一个专用标签。WPF把包含数据的对象称为数据源,用于把数据源中的数据提供给数据使用者的对象被称做是数据提供者,WPF中包含多种数据提供者,其中一个类名叫做XmlDataProvider实例,那么XmlDataProvider实例的数据就要放在x:XData的标签内容里。



参考《深入浅出WPF》
























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210582.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:20
下一篇 2026年3月19日 上午7:20


相关推荐

  • JAVA能写大型游戏么?「建议收藏」

    JAVA能写大型游戏么?「建议收藏」JAVA能写大型游戏么?答:不能,所谓的大型游戏一般都是指端游。必须是C++这没办法C++和java的效率还是有很大差距的。在游戏业Java可以搞什么?那就是页游和手游的服务端了,页游的前端都是Flash,手游的前端是coco2dx(C++),unity3D(C#或JS)你可以看看37游戏墨麟集团上海易娱明朝网络动网先锋掌趣科技等等游戏公司他们都找Java游戏服务端的…

    2022年5月27日
    64
  • zookeeper入门教程_ZooKeeper的事件机制原理

    zookeeper入门教程_ZooKeeper的事件机制原理zookeeperwatcher架构zookeeper 配置中心分布式ID分布式锁集群搭建数据一致性协议:zab协议Zookeeper Leader选举Observer角色及其配置watcher架构客户端首先将Watcher注册到服务器,同时将Watch对象保存到客户端的Watch管理器中。当Zookeeper服务器监听到的数据发生变化时,服务器会通知客户端,接着客户端的Watch管理器会触发相关的Watcher来回调响应处理逻辑,从而完成整体的数据发布/订阅流程。javaAPIJava

    2022年8月9日
    8
  • 字节全家桶 Seed 2.0 + TRAE 玩转 Skill

    字节全家桶 Seed 2.0 + TRAE 玩转 Skill

    2026年3月12日
    2
  • treetable php,jQuery树型表格插件jQuery treetable

    treetable php,jQuery树型表格插件jQuery treetable插件描述:jQuery-treetable是一个jQuery插件。有了这个插件,你可以在一个HTML表格中显示树,即目录结构或嵌套列表。它使你的HTML文件干净的,展现出树状表格插件,你只需要每一行数据添加特定的数据属性。jQuery-treetable有了这个插件,你可以在一个HTML表格中显示树,即目录结构或嵌套列表。它使你的HTML文件干净的,展现出树状表格插件,你只需要每一行数据添加特定的…

    2022年5月2日
    81
  • 安捷伦频谱仪的使用方法图解_安捷伦E4402B频谱仪使用说明

    安捷伦频谱仪的使用方法图解_安捷伦E4402B频谱仪使用说明标签:安捷伦仪器使用说明安捷伦仪器使用说明本资料为安捷伦频谱仪器使用说明,资料用于学习交流不能以任何形式商用。文档内容节选AgilentE4402BESAESeriesSpectrumAnalyzer使用方法简介宁波之猫2009617…

    2022年8月11日
    8
  • HashMap 为什么线程不安全?

    HashMap 为什么线程不安全?HashMap 为什么线程不安全 文章目录 HashMap 为什么线程不安全 前言项目环境 1 put 方法中的 modCount 问题 2 扩容期间取值不准确 3 同时 put 碰撞导致数据丢失 4 可见性问题 5 扩容头插法可能导致的循环链表问题 6 总结 7 参考前言本文从以下几个方面来讨论 HashMap 为什么是线程不安全的 put 方法中的 modCount 问题扩容期间取值不准确同时 put 碰撞导致数据丢失可见性问题扩容头插法可能导致的循环链表问题 jdk1 8 以前版本 jd

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号