• XAML 概述三


    通过对前面2节对XAML的介绍,我们对XAML有了一定的认识。这一节我们来简单了解一下部分XAML命名空间(x:)语言功能。

     x命名空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的类与解析XAML语言相关。与C#语言一样,XAML也有自己的编译器。XAML文档会被解析并编译,最终形成IL存储在程序集中。在解析和编译XAML的过程中,我们需要告诉编译器一些信息,比如XAML代码编译结果与那个C#代码的编译结果合并等。这些能让我们与XAML编译器沟通的工具就放在x名称空间中。

    通过x命名空间在XAML中出现的形式,我们可以分为如下几类:

     · Attribute

     · 标记扩展

     · XAML指令元素

    接下来我们就来介绍一下其中主要的功能。

    一. x命名空间中的Attribute

    1. x:Class

    这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。语法为:

    <object x:Class="namespace.classname"...>
      ...
    </object>

    这个Attribute只能用于根节点

    namespace可填。指定一个包含由 classname 标识的分部类的 CLR 命名空间。 如果指定了 namespace,则用一个点 (.) 来分隔 namespace 和 classname

    classname必填。并且必须与该代码隐藏相连接的分部类的名称对应。并且代码隐藏相连接的类必须使用部分类,也就是partial关键字修饰。

    2. x:ClassModifier

    在同时提供了 x:Class 的情况下,修改 XAML 编译行为,告诉由标签生成的类具有怎样的访问控制级别。

    使用时必须注意:

     · 必须同时具有x:Class 

     · 必须与x:Class所指示类的访问控制级别一致。分为public(默认的)和internal2种。

    3. x:Name

    如果我们通过XAML声明了一个元素,XAML编译器会为我们生成一个与该元素对应的对象。但是如果我们想在代码中找到该元素并使用,就必须为该对象声明一个引用类型的变量。这个时候x:Name就派上用场了。

    它具有2个作用:

     · 告诉XMAL编译器,当一个标签元素带有x:Name时,除了要生成对应的实例,还要生成一个引用类型的变量,这个变量名就是x:Name的值。

     · 讲生成对象的Name属性(如果有)也设置成x:Name的值,并把这个值注册到UI树上,方便查找。

    在XAML中,必须为类声明了RuntimeNameProperty特性才能使用Name,它和x:Name是等效的。

    我们查看StackPanel的源代码,发现在间接基类FrameworkElement中,使用了RuntimeNameProperty("Name")特性,所有在使用XAML的时候才有Name属性。

    我们不能同时设置Name和x:Name。最好使用x:Name,因为有的元素没有Name这个Attribute,并且x:Name的功能覆盖了Name的功能。

    4. x:FileModifier

    在使用x:Name后,XAML元素对应的实例就有了自己的引用类型的变量,这些变量都是类的字段。这些字段的访问级别默认都是internal的,如果我们想改变他的访问级别,就可以使用x:FileModifier。

    需要注意的一点就是x:FileModifier,必须要和x:Name(或Name)一起使用。

    5. x:key

    在XAML中,我们可以把需要多次使用的内容提取出来放在资源字典中,需要使用这个资源字典的时候就要使用它的key检索出来。语法为:

    <object x:Key="stringKeyValue".../>
    -or-
    <object x:Key="{markupExtensionUsage}".../>

    第一种是要用作键的文本字符串。 文本字符串必须符合XamlName语法。

    第二种是使用标记扩展。

    在XAML中定义的资源的x:key,同样可以使用this.FindResource("keyName")方法在代码隐藏文件中访问。

    6. x:Shared

    该Attribute必须和x:key同时使用。当我们把某些对象作为资源放进资源字典后,可以把它检索出来反复使用。那么当我们每次检索的时候,是同一个对象,还是多个对象的副本就需要设置x:Shared的值。默认值为true,当设置成false的时候,会修改 WPF 资源检索行为,以便特性化资源请求为每个请求创建一个新实例,而不是所有请求共享同一个实例。

    二. 标记扩展

    1. x:Type

    一般情况下我们操作的是数据类型的实例或者引用,但是有时候需要使用x:Type来操作数据类型本身。

    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="FontFamily" Value="Segoe Black" />
      <Setter Property="HorizontalAlignment" Value="Center" />
      <Setter Property="FontSize" Value="12pt" />
      <Setter Property="Foreground" Value="#777777" />
    </Style>

    上面这个例子就是操作TextBlock控件,并设置他的样式。

    2. x:Null

    在C#代码中,我们使用null来表示空值,但是在XAML中使用x:Null.

    比如上面一段示例代码定义了TextBlock的样子,我们还可以在代码里面设置它,让他为空来覆盖这个样式资源。

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

    3. x:Array

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

    <ListBox Margin="5">
         <ListBox.ItemsSource>
              <x:Array Type="system:String">
                   <system:String>A</system:String>
                   <system:String>B</system:String>
              </x:Array>
         </ListBox.ItemsSource>
    </ListBox>

    我们不能设置ItemsSource="{x:Array Type=system:String,Items=xxxx},因为Items是一个只读属性。

    上面的例子,我们就是使用属性元素的方式来声明的。在解析的时候,会调用ArrayExtension源代码中的AddChild方法,把A,B添加到Items里。

    4. x:Static

    它的作用是访问一个static类型的属性或者字段。

    三. XAML指令元素

    只有x:Codex:XData

    前面已经讲过x:Code,我们来看看x:XData。WPF中巴包含数据源的对象称为数据源,用于把数据源中的数据提供给使用者的对象称为数据提供者。WPF类库中包含许多数据提供者,其中一个是XmlDataProvider,专门用于提供XML化的数据。我们通过一个例子就明白了:

    <Window.Resources>
         <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
                <x:XData>
                    <Inventory xmlns="">
                        <Books>
                            <Book ISBN="0-7356-0562-9" Stock="in" Number="9">
                                <Title>XML in Action</Title>
                                <Summary>XML Web Technology</Summary>
                            </Book>
                            <Book ISBN="0-7356-1370-2" Stock="in" Number="8">
                                <Title>Programming Microsoft Windows With C#</Title>
                                <Summary>C# Programming using the .NET Framework</Summary>
                            </Book>
                            <Book ISBN="0-7356-1288-9" Stock="out" Number="7">
                                <Title>Inside C#</Title>
                                <Summary>C# Language Programming</Summary>
                            </Book>
                            <Book ISBN="0-7356-1377-X" Stock="in" Number="5">
                                <Title>Introducing Microsoft .NET</Title>
                                <Summary>Overview of .NET Technology</Summary>
                            </Book>
                            <Book ISBN="0-7356-1448-2" Stock="out" Number="4">
                                <Title>Microsoft C# Language Specifications</Title>
                                <Summary>The C# language definition</Summary>
                            </Book>
                        </Books>
                        <CDs>
                            <CD Stock="in" Number="3">
                                <Title>Classical Collection</Title>
                                <Summary>Classical Music</Summary>
                            </CD>
                            <CD Stock="out" Number="9">
                                <Title>Jazz Collection</Title>
                                <Summary>Jazz Music</Summary>
                            </CD>
                        </CDs>
                    </Inventory>
                </x:XData>
          </XmlDataProvider>
    </Window.Resources>
    
        <StackPanel>
            <ListBox Width="500" Height="300" Background="Honeydew">
                <ListBox.ItemsSource>
                    <Binding Source="{StaticResource InventoryData}"
                        XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
                </ListBox.ItemsSource>
            </ListBox>
        </StackPanel>

    我们在资源中通过x:XData定义了一个XML的数据源,并通过XmlDataProvider提供给使用者ListBox.

  • 相关阅读:
    SSH框架整合实现Java三层架构实例(一)
    【面试】MySQL的事务和索引
    Spring在web开发中的应用
    Freemarker 页面静态化技术使用入门案例
    jQuery EasyUI window窗口使用实例
    zTree树形菜单交互选项卡效果实现
    zTree树形菜单使用实例
    jQuery EasyUI 选项卡面板tabs使用实例精讲
    jQuery EasyUI 折叠面板accordion的使用实例
    jQuery EasyUI布局容器layout实例精讲
  • 原文地址:https://www.cnblogs.com/Mind-Hacker/p/3476131.html
Copyright © 2020-2023  润新知