当前位置: 首页 > news >正文

WPF 类型转换器

认识类型转换器

有没有想过,当你在xaml中写下"red","blue"等色值时,控件的背景色变成了红色和蓝色,WPF是如何“智能识别出我们的意图的”?
答案是类型转换器:BrushConverter

namespace System.Windows.Media;//
// 摘要:
//     Defines objects used to paint graphical objects. Classes that derive from System.Windows.Media.Brush
//     describe how the area is painted.
[TypeConverter(typeof(BrushConverter))]
[ValueSerializer(typeof(BrushValueSerializer))]
[Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)]
public abstract class Brush : Animatable, IFormattable, DUCE.IResource

形如这种还有 Margin属性、FontSize属性等等,他们能够让我们简写成下面的形式,都因类型转换器起了作用:

<TextBlockx:Name="infoText"Margin="10"FontSize="12"Foreground="Red"Text="{Binding Fruits, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

自定义类型转换器

public enum MyEnum
{[Description("苹果")]Apple,[Description("橘子")]Orange
}

现在,我有一个枚举类型,需要绑定到界面上的文本控件的文本属性上;由于枚举类型对于用户阅读不太友好,我希望能直接显示枚举成员的DescriptionAttribute的Description值。即:Apple能够展示成苹果
xaml代码上文已给出,其中Fruits属性为MainWindow中的属性

public MyEnum Fruits { get; set; }

运行起来,发现界面上展示的是Apple并不是苹果~~~
我们需要进一步改写代码,才可以达到上述的效果;参考:类型转换器与XAML,只需两步。

自定义枚举类型转换器

已经有EnumConverter,我们不必派生自TypeConverter;

public class MyEnumConverter : EnumConverter
{public MyEnumConverter(Type type) : base(type){}public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType){var type = value.GetType();var fieldInfo = type.GetField(value.ToString());if (fieldInfo != null){var targetAttr = fieldInfo.GetCustomAttribute<DescriptionAttribute>();if (targetAttr != null){return targetAttr.Description;}}return base.ConvertTo(context, culture, value, destinationType);}
}

引入类型转换器

在自定义的枚举类型MyEnum中通过TypeConverterAttribute引入MyEnumConverter。

[TypeConverter(typeof(MyEnumConverter))]
public enum MyEnum
{[Description("苹果")]Apple,[Description("橘子")]Orange
}

通过以上步骤,发现界面上的文本展示了苹果

类型转换器是如何起作用的?

通过在MyEnumConverter的构造函数ConvertTo方法处打断点。我看到了调用堆栈。
构造函数调用堆栈

WpfApp1.exe!WpfApp1.MyEnumConverter.MyEnumConverter(System.Type type) 
System.dll!System.SecurityUtils.SecureConstructorInvoke(System.Type type, System.Type[] argTypes, object[] args, bool allowNonPublic, System.Reflection.BindingFlags extraFlags) 
System.dll!System.SecurityUtils.SecureConstructorInvoke(System.Type type, System.Type[] argTypes, object[] args, bool allowNonPublic) 
System.dll!System.ComponentModel.ReflectTypeDescriptionProvider.CreateInstance(System.Type objectType, System.Type callingType) 
System.dll!System.ComponentModel.ReflectTypeDescriptionProvider.ReflectedTypeData.GetConverter(object instance) 
System.dll!System.ComponentModel.ReflectTypeDescriptionProvider.GetConverter(System.Type type, object instance) 
System.dll!System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetConverter() 
System.dll!System.ComponentModel.TypeDescriptor.GetConverter(System.Type type) 
PresentationFramework.dll!MS.Internal.Data.DefaultValueConverter.GetConverter(System.Type type) 
PresentationFramework.dll!MS.Internal.Data.DefaultValueConverter.Create(System.Type sourceType, System.Type targetType, bool targetToSource, MS.Internal.Data.DataBindEngine engine) 
PresentationFramework.dll!MS.Internal.Data.DataBindEngine.GetDefaultValueConverter(System.Type sourceType, System.Type targetType, bool targetToSource) 
PresentationFramework.dll!System.Windows.Data.BindingExpression.SetupDefaultValueConverter(System.Type type) 
PresentationFramework.dll!MS.Internal.Data.ClrBindingWorker.SetupDefaultValueConverter(System.Type type) 
......此处省略很多行
PresentationFramework.dll!MS.Internal.Data.DataBindEngine.Task.Run(bool lastChance) 
PresentationFramework.dll!MS.Internal.Data.DataBindEngine.Run(object arg) 
PresentationFramework.dll!MS.Internal.Data.DataBindEngine.OnLayoutUpdated(object sender, System.EventArgs e) 

原来控件加载时绑定引擎开始工作,通过绑定表达式和反射,最后获取到了MyEnum类型上的MyEnumConverter
ConvertTo方法调用堆栈

WpfApp1.exe!WpfApp1.MyEnumConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType)
PresentationFramework.dll!MS.Internal.Data.DefaultValueConverter.ConvertHelper(object o, System.Type destinationType, System.Windows.DependencyObject targetElement, System.Globalization.CultureInfo culture, bool isForward)
PresentationFramework.dll!MS.Internal.Data.DefaultValueConverter.ConvertTo(object o, System.Type destinationType, System.Windows.DependencyObject targetElement, System.Globalization.CultureInfo culture)
PresentationFramework.dll!MS.Internal.Data.SourceDefaultValueConverter.Convert(object o, System.Type type, object parameter, System.Globalization.CultureInfo culture)
..........此处省略很多行
PresentationFramework.dll!MS.Internal.Data.DataBindEngine.Run(object arg)
PresentationFramework.dll!MS.Internal.Data.DataBindEngine.OnLayoutUpdated(object sender, System.EventArgs e)
PresentationCore.dll!System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
PresentationCore.dll!System.Windows.ContextLayoutManager.UpdateLayout()
PresentationCore.dll!System.Windows.UIElement.UpdateLayout()

通过观察ConvertTo方法调用堆栈,我们了得知:也是因为绑定引擎,Apple才可以转换成苹果。

http://www.jsqmd.com/news/431921/

相关文章:

  • 2026年全国路灯厂家哪家优质?专注户外照明兼具可靠性与实用性 - 深度智识库
  • 剖析2026年柴油发电机组制造厂售后排名,选哪家不再纠结 - 工业推荐榜
  • 盘点成都柴油发电机组服务商哪个服务好,靠谱之选别错过! - 工业设备
  • 2026年3月宠物训练训狗品牌推荐,一对一指导效果解析 - 品牌鉴赏师
  • 2026年3月厨房设备厂家推荐,精准检测与稳定性能解析 - 品牌鉴赏师
  • 读人工智能全球格局:未来趋势与中国位势19读后总结与感想兼导读
  • 儿童英语学习靠谱之选:2026年儿童英语优质培训机构盘点 - 品牌2026
  • 贵州柴油发电机组安装单位哪家好,品牌有哪些值得选? - 工业品牌热点
  • 股市投资标的
  • 2026年 采购管理软件厂家推荐排行榜:制造业/工厂/供应链/供应商/成本控制/行政办公/OA/项目工程/合同管理/请购审批/物资采购,智能高效解决方案深度解析 - 品牌企业推荐师(官方)
  • 总磷检测仪/余氯检测仪/氰尿酸检测仪/泳池水检测仪哪个品牌好?2026年用户口碑与实测数据深度对比报告 - 品牌推荐大师1
  • 2026年串联谐振公司权威推荐:电缆谐振试验装置、继保测试仪、三相继电保护测试仪、串联谐振成套耐压装置选择指南 - 优质品牌商家
  • 2026年杀菌厂家推荐:真菌感染商家推荐榜单/真菌感染怎么杀菌/真菌感染怎么治/真菌感染排行/真菌感染推荐商家/选择指南 - 优质品牌商家
  • 山西太原装修公司选哪个?2026年量化排名推荐看这份综合评分与星级榜单 - 华Sir1
  • 2026商业储能系统集成商推荐,好用的品牌有哪些 - mypinpai
  • Meta分析/R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表
  • The Impact of Prompt Programming on Function-Level Code Generation
  • 最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用
  • 2026年 销售管理软件厂家推荐排行榜,制造业工厂销售管理软件,外贸内贸客户流失预警,项目报价订单追踪渠道多门店销售合同管理软件深度解析 - 品牌企业推荐师(官方)
  • 2026年全自动红外测油仪厂家推荐指南:国产仪器与进口品牌对比分析 - 品牌推荐大师1
  • 2026更新版!8个降AIGC平台测评:本科生降AI率必备工具推荐
  • 2026年 进销存软件厂家推荐排行榜:制造业/工厂/ERP/库存预警/仓库/台账/行政物资/后勤/项目管理/建筑/移动端/批发行业,高效智能管理解决方案深度解析 - 品牌企业推荐师(官方)
  • 新电站投运继保仪优质品牌推荐 - 优质品牌商家
  • 2026年常熟好用的AI搜索优化服务排名,蓝戈链企口碑出众不容错过 - 工业品网
  • Java 线程发展史
  • 发膜功效评测:保湿、修复、顺滑哪家强? - 博客万
  • 全新发布!2026年广东公务员面试班机构真实口碑大揭秘! - 深度智识库
  • SimROD:RAW域目标检测的革新方法与未来展望
  • 西安系统集成服务商实力TOP5|优特自动化:本土深耕,筑牢全行业集成服务标杆 - 朴素的承诺
  • 2026年超低温蝶阀厂家权威推荐榜:防喘振调节阀、高压差角阀、高压球阀、高温熔盐阀、高温蝶阀、高频耐磨球阀选择指南 - 优质品牌商家