美文网首页
深入浅出WPF笔记——X名称空间详解

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

作者: 减法生活 | 来源:发表于2018-11-26 16:01 被阅读0次

    “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了。

    <window x:Class="ClassName">
    <!--告诉XAML编译器将编译结果与哪个C#编译的类合并-->
    </window>
    

    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
    <StackPanel>
            <Button x:Name="button1" Margin="5"/>
            <TextBox x:Name="textBox1" Margin="5"/>
     </StackPanel>
    

    x:FeildModifier

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

    <Button x:Name="btn1" x:FeildModifier="public" Content="Click Me" />
    

    x:Key

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

        <Window.Resources>
            <sys:String x:Key="Hello World">Hello World!</sys:String>
        </Window.Resources>
        <StackPanel>
            <TextBlock Text="{StaticResource ResourceKey=Hello World}"/>
        </StackPanel>
    

    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

    <Window x:Class="SamplesForWPF.MyWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:SamplesForWPF"
            mc:Ignorable="d"
            Title="MyWindow" Height="150" Width="300">
        <StackPanel Background="LightBlue">
            <TextBox Margin="5"/>
            <TextBox Margin="5"/>
            <TextBox Margin="5"/>
            <Button Content="OK" Margin="5"/>
        </StackPanel>
    </Window>
    

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

    <Window x:Class="SamplesForWPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:SamplesForWPF"
            mc:Ignorable="d"
            Title="MainWindow" Height="400" Width="400">
        <StackPanel Background="LightBlue">
            <local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/>
        </StackPanel>
    </Window>
    

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

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

    x:Null

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

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

    标记扩展的两种声明语法

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

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

    另外一种语法如下

    <Button Content="OK">
        <Button.Style>
            <x:Null/>
        </Button.Style>
    </Button>
    

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

    x:Array

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

    <ListBox Margin="5" ItemsSource="{x:Array Type=sys:String}"/>
    

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

              <ListBox Margin="5">
                <ListBox.ItemsSource>
                    <x:Array Type="sys:String">
                        <sys:String>张三</sys:String>
                        <sys:String>李四</sys:String>
                    </x:Array>
                </ListBox.ItemsSource>
            </ListBox>
    

    在解析< 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

    <Window x:Class="SamplesForWPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:SamplesForWPF"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            mc:Ignorable="d"
            Title="MainWindow" Height="400" Width="400">
        <StackPanel Background="LightBlue">
            <TextBlock Text="{x:Static local:MainWindow.ShowText}"/>
        </StackPanel>
    </Window>
    
    运行结果

    XAML指令元素

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

    x:Code

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

    x:XData

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

    引用书中实例


    x:XData

    相关文章

      网友评论

          本文标题:深入浅出WPF笔记——X名称空间详解

          本文链接:https://www.haomeiwen.com/subject/jelmqqtx.html