[WPF]标记扩展(Markup Extension)

这篇具有很好参考价值的文章主要介绍了[WPF]标记扩展(Markup Extension)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

XAML是基于XML的语言,其遵循并扩展了XML的语法规则。其中一项扩展就是标记扩展(Markup Extension),比如我们经常使用的绑定Bindingx:Type

什么是标记扩展

标记扩展允许在XAML标记中使用特殊的语法来动态地为特性(Attribute)赋值或执行其他操作。简单来说,在XAML中,所有为XAML元素特性(Attribute)赋值时,使用花括号{}包裹起来的语句就是标记扩展。这么定义不是特别严谨,因为转义序列也是以花括号{}作为标记的,但不是标记扩展。[1] 后边提到的x:Array标记扩展使用的是<>。

标记扩展的语法是{标记扩展类 参数},所有的标记扩展类都是派生自System.Windows.MarkupExtension基类实现的。开篇提到的Bindingx:Type都是WPF框架内置的标记扩展。细心的朋友会发现这两个标记扩展一个带x:前缀,一个不带。这就不得不提WPF中的两类标记扩展。

  • XAMl定义的标记扩展
  • 特定于 WPF 的标记扩展。

XAML定义的标记扩展

XAML定义的标记扩展在System.Xaml程序集中,位于XAML命名空间内,并非WPF特定的实现。这类标记扩展通常由x:前缀标识。主要有以下几种:

  • x:Static 用于引用以符合公共语言规范 (CLS) 的方式定义的任何静态按值代码实体。 可使用引用的静态属性在 XAML 中提供属性的值。
  • x:Type 为命名类型提供 Type 对象。此扩展最常用于样式和模板。
  • x:Array 通过标记扩展提供对 XAML 中对象的数组的一般支持。需要注意的是,在 XAML 2009 中,x:Array定义为语言基元而不是标记扩展。[2]
  • x:Null 将 null 指定为属性的值,可用于特性或属性元素值。

特定于WPF的标记扩展

最常见的标记扩展是支持资源引用的标记扩展(StaticResource 和 DynamicResource),和支持数据绑定的标记扩展 (Binding)。特定于WPF的标记扩展有以下几种:[3]

  • StaticResource 通过查找对已定义资源的引用,为任何 XAML 属性提供值。 查找该资源的行为类似于加载时查找,将查找当前 XAML 页面先前的标记以及其他应用程序源中加载的资源,并将生成该资源值作为运行时对象中的属性值。该标记扩展要求引用的资源必须在引用之前声明,否则加载时找不到资源报错。
  • DynamicResource 通过将值推迟为对资源的运行时引用来为属性提供值。 动态资源引用强制在每次访问此类资源时都进行新查找。该标记扩展引用的资源则对声明的位置没有太多要求,因为它在运行的时候采取查找资源。
  • Binding 将属性值延迟为数据绑定值,创建中间表达式对象并在运行时解释应用于元素及其绑定的数据上下文。此标记扩展相对复杂,因为它会启用大量内联语法来指定数据绑定。
  • RelativeSource 在设置 XAML 中创建的 Binding 元素的 RelativeSource 属性时使用。例如嵌套在 Binding 扩展内
<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />
  • TemplateBinding 使控件模板能够使用模板化属性的值,这些属性来自于将使用该模板的类的对象模型定义属性。换言之,模板定义中的属性可访问仅在应用了模板之后才存在的上下文。
  • ColorConvertedBitmap 提供方法来指定没有嵌入配置文件的位图源。 颜色上下文/配置文件由 URI 指定,与图像源 URI 一样。
<object property="{ColorConvertedBitmap imageSource sourceIIC destinationIIC}" ... />
  • ComponentResourceKey 定义和引用从外部程序集加载的资源的键。 这使资源查找能够在程序集中指定目标类型,而不是在程序集中或类上指定显式资源字典。
  • ThemeDictionary 为集成第三方控件的自定义控件创作者或应用程序提供一种方法,用于加载要在设置控件样式时使用的特定于主题的资源字典。

自定义标记扩展

上文提到所有的标记扩展类都是派生自System.Windows.MarkupExtension基类实现的。因此自定义标记扩展也需派生自这个基类。MarkupExtension仅提供一个简单的ProvideValue(IServiceProvider serviceProvider)方法来获取所期望的数值。接下来用个简单的例子进行说明:

public class AddExtension : MarkupExtension
{
    private string _value;

    private string _value1;

    public string Value1
    {
        get => _value1;
        set => _value1 = value;
    }

    public AddExtension()
    {

    }

    public AddExtension(string par)
    {
        _value = par;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (_value == null) { throw new InvalidOperationException(); }

        int iv, iv1;
        if (int.TryParse(_value, out iv) && int.TryParse(Value1, out iv1))
        {
            return iv + iv1;
        }
        else
            return _value;
    }
}

这个自定义的标记扩展定义了一个带参构造函数和一个属性用于接收参数,并通过重写ProvideValue方法返回两个参数的和。以下代码是使用该标记扩展的示例。

<Button Content="{local:Add 2,Value1=5}"/>

根据约定,标记扩展的命名都是以Extension结尾,在引用扩展类时可以省略最后一个单词Extension,示例中紧跟在local:Add后的2是作为构造函数的参数,Value1=5则是给标记扩展中定义的属性Value1赋值。

小结

本文介绍了WPF的基础概念标记扩展,并列举了WPF框架内置了两大类标记扩展。最后用一个不太有实际意义的简单示例展示了如何自定义标记扩展。由于MarkupExtension并非派生自DependencyObject,因此不能直接定义依赖属性,但可以通过定义一个依赖对象结合附加属性的方式实现扩展标记属性的绑定。

参考


  1. https://learn.microsoft.com/zh-cn/dotnet/desktop/xaml-services/escape-sequence-markup-extension ↩︎

  2. https://learn.microsoft.com/zh-cn/dotnet/desktop/xaml-services/types-for-primitives ↩︎

  3. https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/wpf-xaml-extensions?view=netframeworkdesktop-4.8 ↩︎文章来源地址https://www.toymoban.com/news/detail-746555.html

到了这里,关于[WPF]标记扩展(Markup Extension)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Realm Management Extension领域管理扩展之系统架构

    RME不仅仅是一组处理器功能,为了充分利用RME引入的功能,系统的其余部分需要提供支持。 下图显示了一个示例系统以及引入RME后受到影响的组件: 主存储器保护 RME启用的系统包括内存加密和可能的完整性。基线加密要求支持对外部内存进行加密,使用每个PA空间的单独加

    2024年01月17日
    浏览(29)
  • C++(3)C++对C的扩展Extension

    1、类型更加严格 不初始化,无法通过编译;C不初始化,则随机赋值         C++不喜欢指针和强制类型转换 2、增加bool类型(其实是增加了枚举) C语言中表示真假,用0和非0   string s; bool b = true / false; enum BOOL{ FALSE, TRUE}; BOOL a = FALSE; 3、枚举等价关系 C++中尽量不用宏,能

    2024年02月11日
    浏览(34)
  • 是的,Android版Edge浏览器支持Extension(插件/扩展)了

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。 有些小伙伴的消息渠道实在过于灵通,所以这件事我也不用藏着掖着了。 (此处插件指的就是Extension,虽然Extension最标准的翻译应该是扩展) 其实Extension这

    2024年04月09日
    浏览(46)
  • Nacos 共享配置(shared-configs)和扩展配(extension-config)

    日常开发中,多个模块可能会有很多共用的配置,比如数据库连接信息,Redis 连接信息,RabbitMQ 连接信息,监控配置等等。那么此时,我们就希望可以加载多个配置,多个项目共享同一个配置之类等功能,Nacos Config 也确实支持。 Nacos在配置路径 spring.cloud.nacos.config.extension-c

    2024年02月15日
    浏览(37)
  • 论文浅尝 | 训练语言模型遵循人类反馈的指令

    笔记整理:吴亦珂,东南大学硕士,研究方向为大语言模型、知识图谱 链接:https://arxiv.org/abs/2203.02155 1. 动机 大型语言模型(large language model, LLM)可以根据提示完成各种自然语言处理任务。然而,这些模型可能会展现出与人类意图不一致的行为,例如编造事实、生成带有偏

    2024年02月09日
    浏览(45)
  • Elasticsearch:使用标记修剪提高文本扩展性能

    作者:来自 Elastic Kathleen DeRusso 本博客讨论了 ELSER 性能的令人兴奋的新增强功能,该增强功能即将在 Elasticsearch 的下一版本中推出! 我们已经详细讨论了 Elasticsearch 中的词汇和语义搜索以及使用向量字段的文本相似性搜索。 这些文章对向量搜索的工作原理提供了精彩、深入

    2024年03月25日
    浏览(41)
  • 基于C#语言的GUI开发,主要介绍WPF框架

    下面是几种常见基于.Net的界面开发框架,都是Microsoft提供,下面简介由GPT生成 WinForms (Windows Forms WPF (Windows Presentation Foundation) UWP (Universal Windows Platform) MAUI (Multi-platform App UI) WinForms(Windows Forms): 介绍: WinForms是由Microsoft提供的用于开发Windows桌面应用程序的UI框架。它使用简单

    2024年02月03日
    浏览(42)
  • AGI之Agent:《GitAgent: Facilitating Autonomous Agent with GitHub by Tool Extension通过工具扩展实现与GitHub的自主代

    AGI之Agent:《GitAgent: Facilitating Autonomous Agent with GitHub by Tool Extension通过工具扩展实现与GitHub的自主代理》翻译与解读 目录 《GitAgent: Facilitating Autonomous Agent with GitHub by Tool Extension通过工具扩展实现与GitHub的自主代理》翻译与解读 Abstract Figure 1: Illustration of autonomous tool extension

    2024年01月23日
    浏览(43)
  • 《Training language models to follow instructions》论文解读--训练语言模型遵循人类反馈的指令

    目录 1摘要 2介绍 方法及实验细节 3.1高层次方法论 3.2数据集 3.3任务 3.4人体数据收集  3.5模型 3.6评价 4 结果 4.1 API分布结果 4.2公共NLP数据集的结果 4.3定性结果 问题 1.什么是rm分数 更多资料 使语言模型更大并不能使它们更好地遵循用户的意图。例如,大型语言模型可能生成不

    2024年01月24日
    浏览(50)
  • 【人工智能】为什么说大语言模型能力遵循规模理论 Scaling Law(即模型能力随着训练计算量增加而提升) ?

    目录 为什么说大语言模型能力遵循规模理论 Scaling Law(即模型能力随着训练计算量增加而提升) ?

    2024年03月25日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包