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

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

一、Attribute类型的工具

二、标签扩展类型的工具

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

我们可以看到,他们分为Attribute,标记扩展和XAML指令元素三类。

  • Attribute

Attribute是语言层面的东西,是给XAML编译器看的,Property是面向对象层面的东西,是给编程逻辑用的。在使用XAML编程的时候,如果你想给他加上一些特殊的标记从而影响XAML编译器对他的解析,那么就要对他添加一些Attribute。

常用的一些Attribute

x:Class

这个Attribute主要告诉XAML编译器,编译的XAML将和哪一个类合并。

使用x:Class要注意:这个Attribute只能用于根节点,指向的类必须使用关键字partial

x:ClassModifier

这个Attribute主要告诉XAML编译器,有标签编译生成的类具有怎样的访问控制级别。

x:Name

这个就如winform中的ID一样

x:FieldModifier

这个就是用来在XAML里改变引用变量访问级别的

x:Key

最自然的检索方式莫过于使用"Key-Value"对的形式了。在XAML文件中,我们可以把很多需要多次使用的内容提取出来放在资源字典中,需要用到的时候就用这个Key把它检索出来。

x:Shared

在学习使用x:key时我们已经知道,一旦我们把某些对象当做资源放进资源字典里后就可以把他们检索出来重复使用,那么,每当他们检索到一个对象时,我们得到的究竟是同一个对象呢,还是这个对象的多个副本?这就要看x:Shared怎么设置了,默认为true,我们得到的是同一个对象。如果是false,那么我们得到的是这个对象的一个新副本。

  • 标记扩展

x:Type

顾名思义,x:Type的值是一个数据类型的名称。编程中也会用到数据类型本身。

x:Null

在c#语言里,我们用null关键字来表示空值,在XAML里我们就用x:Null来表示空值。

x:Array

x:Array的作用就是通过它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList的成员类型由x:Array的Type指明。

x:Static

在XAML文档中使用数据类型的static成员

  • 指令元素

x:Code

x:Code可以将逻辑代码放到XAML中运行

x:XData

那就是数据源了,在该标签内的内容可以作为数据源使用

这就是x空间里所有的东西了

下面我们就分别介绍一下吧!

一、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关键字

示例代码如下:

前台的xaml代码:

<Window x:Class="WpfApplication3.Window9"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window9" Height="300" Width="300">

...........................................................

后台的cs代码:

public partial class Window9 : Window
    {
        public Window9()
        {
            InitializeComponent();
            List<Student> students = new List<Student>(){
                new Student(){Id=1,Name="Tim",Age=21},
                new Student(){Id=2,Name="Tom",Age=22},
                new Student(){Id=3,Name="Jim",Age=23}
            };

this.listBox1.ItemsSource = students;
            //this.listBox1.DisplayMemberPath = "Name";

Binding bind = new Binding("SelectedItem.Name") { Source = this.listBox1 };
            this.textBox1.SetBinding(TextBox.TextProperty, bind);
        }
    }

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#代码

WPF基础篇之命名空间的更多相关文章

  1. WPF基础篇之移动特效

    前一段时间,在做动画特效的时候,在网上看到了一个水平移动控件的例子.里面用到了RenderTransform特效.在网上查找资料发现了一篇基础的文章: 文章源地址:http://www.ithao12 ...

  2. WPF基础篇之空间布局

    由于之前自己做的都是大多是B/S架构的项目,加入新公司,公司现在用的WPF,在WPF中一个比较重要的知识点:布局 在网上找到一篇比较好的介绍WPF布局的文章. 文章地址:http://www.cnbl ...

  3. WPF基础篇之系统中141种颜色

    WPF最大的特点就是酷炫的外观,在学习过程中经常看见各种渐变窗体.作为几乎没做过美工的程序员,我对各种颜色的argb值不熟,颜色的英文单词也只认识部分.为了不至于每次都用Colors点出颜色再随机挑选 ...

  4. WPF基础篇之连接数据库

    WPF连接DB2数据库 public void ConnectionBD2Func() { //连接数据库字符串,DB2 9.5以下版本使用Data Source=Test,否则查询找不到数据库.DB ...

  5. WPF基础篇之资源文件路径

    WPF资源文件的路径 关于WPF资源文件的路径 这几天在WPF中调用资源文件的Uri时,因为是在代码里调用Uri写的Uri总是不对,要么运行直接报异常,要么说找不到资源文件.下面是我解决的整个经过和碰 ...

  6. WPF基础篇之控件模板(ControlTemplate)

    WPF中每一个控件都有一个默认的模板,该模板描述了控件的外观以及外观对外界刺激所做出的反应.我们可以自定义一个模板来替换掉控件的默认模板以便打造个性化的控件. 与Style不同,Style只能改变控件 ...

  7. WPF基础篇之静态资源和动态资源

    静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源. 一.定义 ...

  8. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  9. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 基础篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与美化, ...

随机推荐

  1. EntityFramework 实践 Overview

    使用EntityFramework,是微软出的一个轻量级ORM框架,对于做一些小型的项目非常方便,几乎是零配置,以及对linq的支持,所以非常的易于使用,虽然已经使用EntityFramework很久 ...

  2. java设计模式在公众号的应用——我是一个快乐的单例

    终于可以休息了,寻一把躺椅,安置于庭院,携一壶好茶,品一番风轻云淡... 自由自在的呼吸,伸手即可触摸阳光的温度,此时此刻,我就是我,像一个单例. 想起『设计模式』,就像想起了很久很久以前的故事,今日 ...

  3. 零基础2018如何系统地学习python?

    首先告诉你的是,零基础学习开始系统学习Python肯定难,Python的专业程度本身就不简单,学习这事本来就是一件非常煎熬的事情,人都不愿意学习,可是没办法,为了生存掌握一个技能,你必须学,如果你认真 ...

  4. [Python Study Notes]CS架构远程访问获取信息--SERVER端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''' ...

  5. Math.abs(~2018),掌握规律!

    Math.abs(~2018) 这要用到一些计算机的基础知识. Math.abs(x)指的是返回一个数的绝对值,而关键在"~2018",这是取反操作符,故取相反数得结果为-2018 ...

  6. C#泛型简单应用

    最近老板要在app里开展金融模块了,产品一下就丢丢丢二三十个表单下来,怎么办,赶紧写代码,有20多个表单要提交呢,得建20多个表.等等,好像这些表单很相似,公司信息,个人信息,可是还有部分不同信息怎么 ...

  7. 市面上有没有靠谱的PM2.5检测仪?如何自己动手制作PM2.5检测仪

     市面上能买到的11中常见的pm2.5检测仪 网上大佬实测并不是很准,我这里没测过(全买下来有点贵,贫穷限制了我的想象力) 这些检测仪多数是复合式.多功能的空气质量检测仪.具体就不一一介绍了.这篇文章 ...

  8. Log4j2配置文件详解

    目录[-] 1 系列目录 2 默认配置 3 第一个配置例子 4 复杂一点的配置 4.1 Appender之Syslog配置 4.2 Syslog及Syslog-ng相关配置(Fedora) 5 Log ...

  9. 分布式缓存一致性hash算法理解

    今天阅读了一下大型网络技术架构这本苏中的分布式缓存一致性hash算法这一节,针对大型分布式系统来说,缓存在该系统中必不可少,分布式集群环境中,会出现添加缓存节点的需求,这样需要保障缓存服务器中对缓存的 ...

  10. maven使用jstl表达式和The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application解决

    maven 中使用jstl表达式中出现如上错误.原因: 1.由于在maven中的web项目没有自动依赖jstl的jar 未在pom文件中添加jstl相关的jar <!--jstl表达式--> ...