zoukankan      html  css  js  c++  java
  • WPF5 x命名空间

    基本上只要是包含了xaml代码的WPF程序都需要通过语句:

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"来引入http://schemas.microsoft.com/winfx/2006/xaml

    这个命名空间。

    显然,这个命名空间所包含的类均与解析XAML语言相关,所以也可以成为XAML命名空间。XAML有自己的编译器,XAML语言被编译解析,最终形成IL语言存储在程序集中。在解析xaml语言的过程中,需要告诉编译器xaml代码编译结果应该与哪个C#编译结果合并,使用xaml声明的元素的访问级别等,这些工具都放置于x命名空间中。

    x命名空间中的Attribute

    1、x:Class

    这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并,使用x:Class时应当遵循:

    A、这个Attribute只用于根节点

    B、使用x:Class的根节点类型和x:Class的值所指示的类型保持一致

    C、x:Class的值所指示的类型在声明时必须使用partial关键字

    2、x:ClassModifer

    这个Attribute用于告诉XAML编译由标签编译生成的类具有怎样的访问控制级别。(WPF默认是public)

    3、x:Name

    XAML是一种声明式语言,XAML标签声明的是对象,一个XAML标签会对应一个对象,一般是一个控件类的实例。类是引用类型,在.NET中只能通过引用者来访问实例,当一个实例不再被任何引用者所引用时,就会被当做内存垃圾而被销毁。

    常见的引用者是引用变量,但并不唯一,例如:

            <TextBox Margin="5"/>
            <Button Name="btnChild" Click="btnChild_Click">ShowChild</Button>
           

    虽然可以通过Window1.Content-StackPanel-Children[0]-TextBox找到,但毕竟太麻烦。这时就是使用x:Name的地方。

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

    <TextBox x:Name="textBox" Margin="5" Width="120" Height="30"/>
    ...
    
            private void btnXName_Click(object sender, RoutedEventArgs e)
            {
                if(string.IsNullOrEmpty(textBox.Name))
                {
                    textBox.Text = "No name";
                }
                else
                {
                    textBox.Text = textBox.Name;
                }
            }

    对于应该实用Name还是x:Name,Name属性定义在FrameworkElement类中,这个类是WPF控件的基类,所有的WPF控件都有Name这个属性,当一个元素有Name属性时,实用Name或x:Name都是一样的。因为此时Name和x:Name的值都一样,只是不能同时出现在一个元素中。但对于那些没有Name属性的元素,就只能实用x:Name,因为x:Name涵盖了Name的全部功能,所以全部使用x:Name就可以增强代码统一性和可读性。

    4、x:FieldModifier

    使用了x:Name后,XAML标签对应的实例就有了自己的引用变量,而且这些引用变量都是类的字段,那么久拥有了访问级别,默认情况下,字段的访问级别和C#一样被设置为了interna(程序集内部可访问),如果需要从一个程序集访问另一个程序集中窗体的元素,就必须修改为public。

    例如:

            <TextBox x:Name="textBox" Margin="5" Width="120" Height="30" x:FieldModifier="public"/>

    5、x:key

    最自然的检索方式就是键值对,在xaml文件中,可以把多次需要使用的内容提取出来放在资源字典中,需要使用的时候就用它的key检索出来。WPF中几乎每个元素都有自己的Resources属性,这个属性就是key-value式集合,只要把元素放进这个集合,这个元素就成为资源字典中的一个条目,为了能检索这个条件,就必须为他添加x:Key。

    例如:

        <Window.Resources>
            <local:Human x:Key="human" Name="JingYe"/>
            <sys:String x:Key="myStr">Hello WPF Resource</sys:String>
        </Window.Resources>
    ...
            xmlns:local="clr-namespace:WPF_XAML_1"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
    ...
    <TextBox x:Name="textBox" Text="{StaticResource ResourceKey=myStr}" Margin="5" Width="120" Height="30" x:FieldModifier="public"/>

    现在资源字典中添加一个条目,这个条目是一个字符串,然后把这个字符串的x:Key设置为myStr,然后为了能在xaml中使用String类,使用xmlns:sys引用System命名空间,编译器会自动补齐,<TextBox>标签的Text属性就可以使用{StaticResource ResourceKey=myStr}来调用myStr这个资源。

    C#也可以使用这个资源。

    MessageBox.Show(this.FindResource("myStr") as string);

    6、x:Shared

    在使用x:Key时,默认情况下,编译器会为资源隐藏添加一个x:Shared="true",标识所有检索这个对象所得到的都是同一个对象,如果为false,则每次检索都是一个新副本。

  • 相关阅读:
    记一次CTF比赛过程与解题思路MISC部分
    使用requests爬虫遇到的一个奇葩的问题:UnicodeEncodeError: 'latin1' codec can't encode character
    纯前端实现词云展示+附微博热搜词云Demo代码
    亚马逊精细化选品服务
    乔布斯访谈笔记
    使用腾讯云轻量级服务器
    centos 设置阿里的yum源
    云未来、新可能 绿色、无处不在、可信的计算
    OpenKruise v1.0:云原生应用自动化达到新的高峰
    服务发现与配置管理高可用最佳实践
  • 原文地址:https://www.cnblogs.com/NicolasLiaoran/p/12988102.html
Copyright © 2011-2022 走看看