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

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

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

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

1. IProvideValueTarget

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

cs 复制代码
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 中的类型名称。这对于需要动态创建类型实例的场景非常有用。

cs 复制代码
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 类型系统的信息。

cs 复制代码
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 树的场景非常有用。

cs 复制代码
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 的场景非常有用。

cs 复制代码
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 中查找命名对象的场景非常有用。

cs 复制代码
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个人主页-哔哩哔哩视频

相关推荐
三千道应用题1 小时前
WPF&C#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表
开发语言·c#·wpf
十一10241 小时前
FX10/20 (CYUSB401X)开发笔记5 固件架构
笔记
FakeOccupational2 小时前
【电路笔记 通信】AXI4-Lite协议 FPGA实现 & Valid-Ready Handshake 握手协议
笔记·fpga开发
奶黄小甜包2 小时前
C语言零基础第18讲:自定义类型—结构体
c语言·数据结构·笔记·学习
rannn_1115 小时前
【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
笔记·后端·学习·mysql
草莓熊Lotso5 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
开发语言·c++·经验分享·笔记·其他
_Kayo_12 小时前
node.js 学习笔记3 HTTP
笔记·学习
星星火柴93615 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
Cx330❀18 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
小幽余生不加糖18 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频