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

一、目的: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.mzph.cn/web/56073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 Kafka

一、引言 在当今的大数据和分布式系统时代,高效的消息传递和处理是构建可靠、可扩展应用的关键。Apache Kafka 作为一种高吞吐量的分布式发布 - 订阅消息系统,在众多领域中发挥着重要作用。本文将深入探讨 Kafka 的核心概念、架构、工作原理、应用场景以…

Axure重要元件三——中继器修改数据

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器修改数据 主要内容:显示编辑内容、表格赋值、修改数据 应用场景:更新行、表单数据行修改 案例展示: 正文…

前端算法合集-2(含面试题-美团一面)

主要考察的就是数组扁平化,由浅入深吧 ①利用tostring()和split() let arr [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]] let newarrarr.toString().split(,) let numarrnewarr.map((item)>{itemNumber(item)return item }) console.log(numarr) ②利用…

AndroidStudio移动开发:使用Service播放音乐【步骤】

目录 一、创建新application 二、准备音乐文件 三、创建项目和布局(如果需要交互界面的话,这里简单假设一个基本布局) 四、创建MusicService类 五、在MainActivity中启动和控制Service(也可以另外创建MusicActivity类&#x…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述: xdsec的小伙伴们和参赛者来上课,碰巧这一天签到系统坏了,作为老师的你,要帮他们 教师代签。 特殊提醒:luo同学今天好像在宿舍打游戏,不想来上课,这是严重的缺勤行为…

实现mysql定时执行任务

使用场景,每天想定时去执行一次数据同步,可以进行实现每天某个时间段去查询两个数据库表中数据进行数据同步 具体步骤包括两步: 先查看定时任务是否开启 SHOW VARIABLES LIKE event_scheduler; #查看是否开启,NO表示开启,默认是…

【数据分享】全国人口-人口年龄结构和抚养比(1990-2021年)

数据介绍 一级标题指标名称单位指标解释人口年末总人口万人年末人口数指每年12月31日24时的人口数。年度统计的全国人口总数内未包括香港、澳门特别行政区和台湾省以及海外华侨人数。1981年及以前人口数据为户籍统计数;1982、1990、2000、2010、2020年数据为当年人口…

Scala的多态

从编译的角度解释Scala的多态含义:在执行期间而非编译期间确定所引用对象的类型,根据实际类型调用其方法。一个编译型语言有两种类型,分别为编译类型和运行类型。程序中定义的引用变量所指向的具体类型和通过该变量发出的方法调用在编译时不确…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式,用户可以通过可视化的方式,简单拖拽,不写代码或者编写少量代码,类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

Redis 常用指令详解

Redis是一款开源的、高性能的键值对存储数据库,常用于缓存、会话存储以及其他需要快速访问的数据场景。本文将介绍Redis的一些常用指令,并通过代码示例进行说明。 一、连接操作指令 1. 连接 Redis 服务器 ./redis-cli -h 127.0.0.1 -p 63792. 认证&a…

计算广告第三版pdf

需要该书pdf版本的同学点赞,私信我:

拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索

本文目录: 💡前言:技术的边界在不断延展🌟目录🌈什么是腾讯云云开发?💾云数据库:让数据成为开发的稳固基石🥑数据,不再只是数据 🛠云模板&#xf…

Spark_入库时报错ORA-00001 unique constraint violated 解决办法

首先可能是数据入重复了 检查一下看看是否入库前删除了分区的数据,可能是重复数据入库的问题,如果不是这个那么继续排查。 入库的数据有问题,检测方法 如果报主键冲突了,则group by 一下id,date,然后select 的时候加一…

docker 数据管理,数据持久化详解 二 数据卷容器

数据卷和数据卷容器核心区别 持久性对比 数据卷:当您直接在启动容器时指定了一个数据卷(例如,使用docker run -v /data),这个数据卷会自动创建,并且其内容会在容器停止或删除后继续存在。您可以随时通过Do…

飞睿智能超宽带UWB音频传输模块,超低延迟数据传输,实时音频声音更纯净

在信息爆炸的时代,音频传输技术正以未有的速度发展,创新我们进入一个全新的听觉世界。今天,我们要探讨的,就是这场技术创新中的一颗璀璨明星——飞睿智能超宽带(UWB)音频传输模块。它以其独特的优势&#x…

RHCSA课后练习1

文件管理命令练习 vi/vim练习 vim newfile 按 a 进入编辑模式 :r 文件 在末尾模式中插入文件 :%s/#/ /g 先将#标记为匹配项:%g#d 再删除 : set nu 开启行号 自行组cp 用grep命令找到6段再用tail命令选中第六段 用find查找 [A-Z]代表所有…

利用 PyTorch 进行深度学习训练过程中模型的 .eval() 和 .train() 属性介绍

介绍 在深度学习训练过程中,一般会有训练阶段和评估阶段,因此定义好模型model时,一般根据模型的属性model.train()和model.eval()来应用训练阶段和评估阶段。在 PyTorch 中,模型的 .eval() 和 .train() 方法用于设置模型的运行模…

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》,有朋友问光代码和文字不太真切,能否补充几张图片,今天我们演示一下: 这是第一帧画面:P1(我们的参考帧) 这是第二帧画面:P2(需要编码的帧&…

游戏引擎中ECS架构及内存布局

一.ECS E:Entity-游戏世界中的人,房子等实际物体,这些物体可能由不同的MetaMesh,ParticleSys组成 C:Component-组成实际物体的MetaMesh,ParticleSys,也可以是一个实际物体 S:System-游戏引擎,负责完成实际物体的初始化,内存管理,帧同步,线程同步等核心功能 二.ECS内存布局 1.创…

python包以及异常、模块、包的综合案例(较难)

1.自定义包 python中模块是一个文件,而包就是一个文件夹 有这个_init_.py就是python包,没有就是简单的文件夹 包的作用:当我们的模块越来越多时,包可以帮助我们管理这些模块,包的作用就是包含多个模块,但包…