WPF自定义MyDouble结构体作为XAML资源如何支持直接内容
解决方案
你只需要给MyDouble结构体添加ContentPropertyAttribute特性,指定直接内容映射到Value属性即可,XAML解析器原生支持字符串到double类型的自动转换,不需要额外修改其他代码。
修改后的代码
首先引入对应命名空间:
using System.Windows.Markup;
修改结构体定义:
[ContentProperty(nameof(Value))] public struct MyDouble { public static implicit operator MyDouble(double d) { return new MyDouble{Value=d}; } public static implicit operator double(MyDouble d) { return d.Value; } public double Value {get;set;} }
原理解释
- XAML 抛出
The type 'MyDouble' does not support direct content报错的核心原因是,XAML解析器不知道自定义类型的内部直接内容要绑定到哪个属性上。ContentPropertyAttribute就是用来显式声明类型的默认内容属性,指定后标签内部的内容会自动赋值给对应的属性。 - 因为你声明的内容属性
Value是系统原生的double类型,XAML解析器内置了字符串到double的转换逻辑,所以不需要额外实现类型转换器。如果后续你需要直接内容赋值给自定义类型的属性,才需要搭配TypeConverterAttribute实现自定义类型转换。 - 你查询到的系统Double实现的若干接口,和XAML直接内容支持没有关联,不需要额外实现。
内容的提问来源于stack exchange,提问作者3xGuy
相关产品推荐
相关产品推荐

