笔记:WPF中MarkupExtension使用的IServiceProvider参数都有哪些

devtools/2024/10/22 10:04:03/

一、目的:WPF中MarkupExtension使用的IServiceProvider参数都有哪些,都是做什么的

        在 WPF 中,MarkupExtension 类的 ProvideValue 方法接受一个 IServiceProvider 参数。IServiceProvider 是一个服务定位器接口,允许你在运行时获取特定的服务。通过这些服务,你可以访问 XAML 解析器的上下文信息,从而实现更复杂和动态的标记扩展。 


二、常见的 IServiceProvider 服务及其作用

1. IProvideValueTarget


        IProvideValueTarget 服务用于获取当前正在设置的目标对象和目标属性。这对于需要知道标记扩展应用位置的场景非常有用。

public override object ProvideValue(IServiceProvider serviceProvider)
{var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));var targetObject = provideValueTarget.TargetObject;var targetProperty = provideValueTarget.TargetProperty;// 你可以使用 targetObject 和 targetProperty 执行一些逻辑return $"Target Object: {targetObject}, Target Property: {targetProperty}";
}

2. IXamlTypeResolver


        IXamlTypeResolver 服务用于解析 XAML 中的类型名称。这对于需要动态创建类型实例的场景非常有用。

public override object ProvideValue(IServiceProvider serviceProvider)
{var typeResolver = (IXamlTypeResolver)serviceProvider.GetService(typeof(IXamlTypeResolver));Type targetType = typeResolver.Resolve("Button");// 你可以使用 targetType 执行一些逻辑return $"Resolved Type: {targetType}";
}

3. IXamlSchemaContextProvider


        IXamlSchemaContextProvider 服务用于获取当前的 XamlSchemaContext,它提供了有关 XAML 类型系统的信息。

public override object ProvideValue(IServiceProvider serviceProvider)
{var schemaContextProvider = (IXamlSchemaContextProvider)serviceProvider.GetService(typeof(IXamlSchemaContextProvider));var schemaContext = schemaContextProvider.SchemaContext;// 你可以使用 schemaContext 执行一些逻辑return $"Schema Context: {schemaContext}";
}

4. IRootObjectProvider


        IRootObjectProvider 服务用于获取 XAML 中的根对象。这对于需要访问整个 XAML 树的场景非常有用。

public override object ProvideValue(IServiceProvider serviceProvider)
{var rootObjectProvider = (IRootObjectProvider)serviceProvider.GetService(typeof(IRootObjectProvider));var rootObject = rootObjectProvider.RootObject;// 你可以使用 rootObject 执行一些逻辑return $"Root Object: {rootObject}";
}

 5. IUriContext


        IUriContext 服务用于获取当前 XAML 文件的基 URI。这对于需要解析相对 URI 的场景非常有用。

public override object ProvideValue(IServiceProvider serviceProvider)
{var uriContext = (IUriContext)serviceProvider.GetService(typeof(IUriContext));var baseUri = uriContext.BaseUri;// 你可以使用 baseUri 执行一些逻辑return $"Base URI: {baseUri}";
}

6. INameScope


        INameScope 服务用于访问 XAML 名称作用域。这对于需要在 XAML 中查找命名对象的场景非常有用。

public override object ProvideValue(IServiceProvider serviceProvider)
{var nameScope = (INameScope)serviceProvider.GetService(typeof(INameScope));var namedObject = nameScope.FindName("myElement");// 你可以使用 namedObject 执行一些逻辑return $"Named Object: {namedObject}";
}

三、总结

        IServiceProvider 在 MarkupExtension 中提供了一种灵活的方式来访问 XAML 解析器的上下文信息。通过这些服务,你可以实现更复杂和动态的标记扩展,满足各种不同的需求。常见的服务包括 IProvideValueTarget、IXamlTypeResolver、IXamlSchemaContextProvider、IRootObjectProvider、IUriContext 和 INameScope 等。了解和使用这些服务可以帮助你更好地控制和扩展 XAML 的行为。

需要了解的知识点 

MarkupExtension 类 (System.Windows.Markup) | Microsoft Learn

MarkupExtension.ProvideValue(IServiceProvider) 方法 (System.Windows.Markup) | Microsoft LearnIProvideValueTarget 接口 (System.Windows.Markup) | Microsoft Learn

IXamlTypeResolver 接口 (System.Windows.Markup) | Microsoft Learn

IXamlSchemaContextProvider 接口 (System.Xaml) | Microsoft Learn

IUriContext 接口 (System.Windows.Markup) | Microsoft Learn

IAmbientProvider 接口 (System.Xaml) | Microsoft Learn

IDestinationTypeProvider Interface (System.Xaml) | Microsoft Learn

IXamlNameResolver Interface (System.Xaml) | Microsoft Learn

IXamlNamespaceResolver Interface (System.Xaml) | Microsoft Learn

IRootObjectProvider Interface (System.Xaml) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

控件库 - WPF .NET Framework | Microsoft Learn

WPF 介绍 | Microsoft Learn

XAML概述 - WPF .NET | Microsoft Learn

Windows Presentation Foundation 简介 - WPF .NET | Microsoft Learn

使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

了解更多

适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

Reference Source

Sysinternals - Sysinternals | Microsoft Learn

Windows app development documentation - Windows apps | Microsoft Learn

欢迎使用 Expression Blend | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/?view=netdesktop-7.0&WT.mc_id=MVP_380318

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频


http://www.ppmy.cn/devtools/127798.html

相关文章

高级sql技巧

以下是一些高级 SQL 技巧: 一、窗口函数 窗口函数可以在不影响数据分组的情况下,对数据进行排序、聚合等操作,非常强大。 排名函数 ROW_NUMBER():为每一行分配一个唯一的连续整数序号。RANK():计算排序值,如果有相同的值会出现并列排名,并且下一个排名会跳过相应的数量…

新一代Linux防火墙已经来临(iptables面临淘汰)

本文全面的介绍了iptables和nftables这两个Linux防火墙工具的基本概念及其主要区别,并给出了选择哪一个工具的建议。 iptables是较早版本的Linux防火墙工具,它已经广泛应用于各种Linux发行版中。iptables的优点在于其广泛的文档支持和社区经验积累&…

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问(Batch Key Access, BKA) 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术,特别是在通过索引进行 JOIN 时,它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行&…

自适应权重

自适应权重(adaptive weights)是一种动态调整权重的策略,广泛应用于深度学习和机器学习的不同领域。这种策略的核心思想是,在模型训练或推理过程中,根据输入数据、模型状态或任务需求来调整各个部分的权重,…

Web,RESTful API 在微服务中的作用是什么?

大家好,我是锋哥。今天分享关于【Web,RESTful API 在微服务中的作用是什么?】面试题?希望对大家有帮助; Web,RESTful API 在微服务中的作用是什么? 在微服务架构中,Web 和 RESTful …

简单三步完成 Telegram 生态的 Web3 冷启动

在竞争激烈的 Web3 领域,强有力的启动往往能决定成败。Telegram 无疑当下最火热的流量池,是很多 Web3 项目冷启动阶段的必选项。 但眼看着好多项目在 Telegram 生态火速获取百万级甚至千万级别的用户,自己的项目要怎么开始做增长,…

比XML更简洁的配置文件——yml(2min了解)

对于计算机应用开发技术,这条路的方向总是化繁为简的。或许有一天,微机课上的小学生,正玩着拼图游戏来开发一款App…… 在Java Web开发中,XML(可扩展标记语言)和YAML(YAML Aint Markup Language…

【Visual Studio 2019 C++ 编译器的路径添加到系统 PATH 环境变量 】

对于某些 Python 包,特别是那些涉及本地扩展或需要编译 C/C 代码的包,需要一个支持 C 开发的环境。Visual Studio 是一个全面的开发环境,它提供了编译器、调试器以及其他许多工具,这些工具对于开发和编译 C 代码非常有用。 下载网…