深入浅出WPF笔记——X名称空间详解

“x”名称空间的成员引导XAML编译器将XAML编译成CLR代码的。“x”就XAML首字母。凡包含XAML代码的WPF程序都需要通过语句 xmlns: x="http:// schemas.microsoft.com/winfx/ 2006/xaml"引入。此名称空间是程序员与XAML编译器沟通的工具。

x名称空间都有什么东东

x名称空间有Attribute、标记扩展和XAML指令元素组成。如下表。

名称 种类(XAML出现的形式)
x:Array,x:Null,x:Static,x:Type 标记扩展
x:Code,x:XData XAML指令元素
x:Key,x:Name,x:Class,x:FeildModifer Attribute
x:ClassModifer,x:Shared,x:TypeArgument,x:Uid Attribute

Attribute

Attribute:语言层面的东西, 是给编译器看的。
Property:对象上面的东西,是给编程逻辑用的。
XAML标签的Attribute大部分对应对象的Property。在XAML编程中,你想添加特殊的标记从而影响XAML编译器的解析,这时候就要添加一些Attribute了。




x:Class

x:Class告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。在使用时遵循以下要求:

  • 只能用于根结点(如:window、UserControl)
  • 使用x:Class的根结点的类型与x:Class的值所指示的类型保持一致
  • x:Class所指示的类型在声明时必须用partial关键字

x:ClassModifier

x:ClassModifier告诉XAML编译器标签编译生成类的访问级别。这个Attribute需要注意以下几点:

  • 标签必须具有x:Class
  • x:ClassModifier值与x:Class`所指类的访问级别一致
  • x:ClassModifier与后台代码的不同而不同,参见TypeAttributes
    例:x:ClassModifier="internal"

x:Name

x:Name给标签对象起个名子,也就是生成对象实例并为它声明一个引用变量,通过这个变量方便C#代码调用这个实例。
注意:

  • 如果一个标签的对象有Name属性,为方便查找将x:NameName赋值相同并注册在UI树上。
  • Name属性WPF控件的基类属性,所有控件都有Name属性。
  • 当一个对象有Name属性,使用x:NameName等同。为提高代码统一性,统一使用x:Name

        

x:FeildModifier

x:FeildModifier改变引用变量的访问级别。使用前必须通过x:Name声明引用变量。

x:Key

x:KeyResource(资源)检索的索引。

    
        Hello World!
    
    
        
    

x:Shared

x:Sharedx:Key配合使用。当x:Shared="true"通过x:Key检索的对象为同一个对象。如果x:Sharp="false"通过x:Key检索的对象是此对象的新副本。

标记扩展

标记扩展(Markup Extension)实际上就是MarkupExtension类直接或间接的派生类。

x:Type

x:Type的值代表一个数据类型的名称。一般情况下,我们在编程中操作着数据类型的实例或是实例的引用。但有些时候我们还会用到数据类型本身。

在XAML中表达一个数据类型就要用到x:Type。比如一个类的属性是一个数据类型,当给此类赋值时。引用一下书中的例子

首先创建一个Button的派生类MyButton,里面包含一个名为UserWindowType的Type类型的属性。

    public 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();
            }
        }
    }

然后创建一个Window的一个派生类MyWindow


    
        
        
        
        

最后把自定义按键MyButton放在主窗口,并将MyWindow赋值给MyButton.UserWindowType


    
        
    

TypeExtension类的构造器支持类型名参数,所以可以写成

UserWindowType="{x:Type local:MyWindow}"

x:Null

x:Null与C#的Null意义相同,代表一个空值。在XAML中,如果给某个对象的属性赋一个空值,我们可以这样写

标记扩展的两种声明语法

常用的方法用朱{}括起来

另外一种语法如下


大多数情况我们都会使用第一种语法,看起不来简洁明了。有一个另外,就是x:Array

x:Array

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


一个String类型的ArrayList作为Data Source赋给了ListBox。此时的ArrayList是一个空的,我们要通个下面的代码向Items添加数据

          
            
                
                    张三
                    李四
                
            
        

在解析< x: Array>标签 的 时候编译器会生成调用AddChild方法的代码把< x: Array>标签 的子元素逐个添加到x: Array实例的Items里。

x:Static

x:Static是用来使用XAML文档中数据类型的静态成员。XAML不能编写逻辑代码,所以使用x:Static访问数据类型的静态成员一定是属性字段。引用书中的例子

   public partial class MainWindow : Window
   {
       public static string WindowTitle = "山高月小";
       public static string ShowText { get { return "水落石出"}; }

       public MainWindow()
       {
           InitializeComponent();
       }
   }

然后用x:Static访问MainWindow.ShowText


    
        
    

深入浅出WPF笔记——X名称空间详解_第1张图片
运行结果

XAML指令元素

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

x:Code

x:Code作用是可以包含本应后置的C#代码。

x:XData

x:XData是一个专用标签。数据提供者XmlDataProvider的实例放在x:XData内容里。

引用书中实例


深入浅出WPF笔记——X名称空间详解_第2张图片
x:XData

你可能感兴趣的:(深入浅出WPF笔记——X名称空间详解)