WPF扩展标记

标记扩展和 WPF XAML,标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能

XAML 处理器和标记扩展

XAML 分析器可将特性值解释为可转换成基元的文本字符串,或可通过某种方法将特性值转换为对象。其中一种方法是引用类型转换器; TypeConverters 和 XAML不过,也存在要求其他行为的情况。例如,可以指示 XAML 处理器,特性的值不应在对象图中生成新对象。特性应生成引用对象图另一部分中的已构造对象或引用静态对象的对象图。另一种情况是,可以指示 XAML 处理器使用向对象构造函数提供非默认参数的语法。在这些类型的情况中,标记扩展可以提供解决方案。

基本标记扩展语法

可以实现标记扩展以便为特性用法中的属性和/或属性元素用法中的属性提供值。

当用于提供特性值时,将标记扩展序列与 XAML 处理器区分开的语法就是左右大括号({ 和 })。然后,由紧跟在左大括号后面的字符串标记来标识标记扩展的类型。

当用在属性元素语法中时,标记扩展在外观上与其他任何用于提供属性元素值的元素相同,即:一个将标记扩展类作为一个元素引用并以尖括号 (<>) 括起的 XAML 元素声明。

XAML 定义的标记扩展

几个标记扩展并非是 XAML 的 WPF 实现所特有的,而是语言形式的 XAML 的内部函数或功能实现。这些标记扩展在 System.Xaml 程序集中作为常规 .NET Framework XAML 服务的一部分而实现,并且位于 XAML 语言 XAML 命名空间中。就常见标记用法而言,这些标记扩展通常可由用法中的 x: 前缀标识。MarkupExtension 基类(也在 System.Xaml 中定义)提供了所有标记扩展均应使用的模式,以便在 XAML 读取器和 XAML 编写器中得到支持(包括在 WPF XAML 中得到支持)。

  • x:Type 为命名类型提供 Type 对象。此工具最常用于样式和模板。有关详细信息,请参见 x:Type 标记扩展

  • x:Static 生成静态值。这些值来自不直接是目标属性值的类型、但可以计算为该类型的值类型代码实体。有关详细信息,请参见 x:Static 标记扩展

  • x:Nullnull 指定为属性的值,可用于特性或属性元素值。有关详细信息,请参见 x:Null 标记扩展

  • 在特意不使用 WPF 基元素和控件模型提供的集合支持的情况下,x:Array 为 XAML 语法中常规数组的创建提供支持。有关详细信息,请参见 x:Array 标记扩展

XAML 定义的标记扩展


有几个标记扩展并非是 XAML 的 WPF 实现所特有的,而是语言形式的 XAML 的内部函数或功能实现。这些标记扩展在 System.Xaml 程序集中作为常规 .NET Framework XAML 服务的一部分而实现,并且位于 XAML 语言 XAML 命名空间中。就常见标记用法而言,这些标记扩展通常可由用法中的 x: 前缀标识。MarkupExtension 基类(也在 System.Xaml 中定义)提供了所有标记扩展均应使用的模式,以便在 XAML 读取器和 XAML 编写器中得到支持(包括在 WPF XAML 中得到支持)。
  • x:Type 为命名类型提供 Type 对象。此工具最常用于样式和模板。有关详细信息,请参见 x:Type 标记扩展

  • x:Static 生成静态值。这些值来自不直接是目标属性值的类型、但可以计算为该类型的值类型代码实体。有关详细信息,请参见 x:Static 标记扩展

  • x:Nullnull 指定为属性的值,可用于特性或属性元素值。有关详细信息,请参见 x:Null 标记扩展

  • 在特意不使用 WPF 基元素和控件模型提供的集合支持的情况下,x:Array 为 XAML 语法中常规数组的创建提供支持。有关详细信息,请参见 x:Array 标记扩展

 
WPF 编程中最常用的标记扩展是支持资源引用的标记扩展(StaticResourceDynamicResource)以及支持数据绑定的标记扩展 (Binding)。
  • StaticResource 通过替换已定义资源的值来为属性提供值。StaticResource 计算最终在 XAML 加载时进行,并且在运行时没有访问对象图的权限。有关详细信息,请参见 StaticResource 标记扩展

  • DynamicResource 通过将值推迟为对资源的运行时引用来为属性提供值。动态资源引用强制在每次访问此类资源时都进行新查找,并在运行时有权访问对象图。为了获取此访问权限,WPF 属性系统中的依赖项属性和计算出的表达式支持 DynamicResource 概念。因此,对于依赖项属性目标,您只能使用 DynamicResource有关详细信息,请参见 DynamicResource 标记扩展

  • Binding 使用在运行时应用于父对象的数据上下文来为属性提供数据绑定值。此标记扩展相对复杂,因为它会启用大量内联语法来指定数据绑定。有关详细信息,请参见 绑定标记扩展

  • RelativeSource 为可以在运行时对象树中定位若干可能关系的 Binding 提供源信息。对于在多用途模板中创建的绑定,或在未充分了解周围的对象树的情况下以代码创建的绑定,上述标记扩展会提供专用源。有关详细信息,请参见 RelativeSource MarkupExtension

  • 通过 TemplateBinding,控件模板可以使用来自要利用该模板的类的对象模型定义属性中的模板化属性的值。换言之,模板定义中的属性可访问仅在应用了模板之后才存在的上下文。有关详细信息,请参见 TemplateBinding 标记扩展有关 TemplateBinding 的实际使用的更多信息,请参见 Styling with ControlTemplates Sample(使用 ControlTemplates 设置样式的示例)。

  • ColorConvertedBitmap 支持相对高级的映像方案。请参见 ColorConvertedBitmap 标记扩展

  • ComponentResourceKeyThemeDictionary 支持资源查找的各个方面,特别是支持查找与自定义控件打包在一起的资源和主题。有关更多信息,请参见ComponentResourceKey 标记扩展ThemeDictionary 标记扩展控件创作概述

下面演示了静态资源扩展标记引用

xaml文件:

<Window x:Class="WPF扩展标记.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <SolidColorBrush x:Key="backgroundBrush">BlanchedAlmond</SolidColorBrush>
        <SolidColorBrush x:Key="borderBrush">blue</SolidColorBrush>
    </Window.Resources>
    <Grid>
        <!--通过标记扩展是支持资源引用的标记扩展,这里只展示了静态资源引用-->
        <Button Background="{StaticResource backgroundBrush}" 
  BorderBrush="{StaticResource borderBrush}" Margin="5,0,95,5">
            <Image Height="200"   Source="1.jpg"/>
        </Button>

    </Grid>
</Window>

简单的效果:
简单示例:https://files.cnblogs.com/BABLOVE/WPF%E6%89%A9%E5%B1%95%E6%A0%87%E8%AE%B0.rar

posted @ 2013-08-03 11:57  如梦不是梦  阅读(787)  评论(0编辑  收藏  举报