XAML Parser如何将Foreground =“Red”中的字符串“Red”转换为SolidColorBrush?尽管我知道Types已经定义了System.ComponentModel.TypeConverter,但我认为WPF XAML解析器在实际上总是使用它们将字符串转换为画笔。除了XamlReader.Load(我想要一个有效的xml字符串)之外,是否有任何XAML API可用于解析单个字符串,就好像它是某个属性的属性一样?
答案 0 :(得分:0)
XAML解析器(用于WPF)实际上确实使用了指定的属性或属性类型的类型转换器。有一些硬编码的快捷方式,但它们是为了提高性能而不改变语义。只使用属性信息的解析器可以复制解析器语义(例如,Blend和Cider所做的事情)。
没有API会像XAML那样完全转换值,因为许多类型转换只能在XAML解析的上下文中工作。例如,类型转换器可以引用XAML文件中定义的名称空间(根据XML文件中值的位置而变化)以及文件的其他环境信息库URI基础。这些仅在解析XAML文件时才真正适用。
您最接近的是从类型描述符中请求属性的属性描述符并使用Converter属性。这将扫描适当的属性以创建正确的类型转换器。
答案 1 :(得分:-1)
我相信你可以自己利用这一点。 XamlReader知道目标类型(必须应用字符串的属性的类型)。您将为该属性的类型注册TypeConverter。
编辑这对SolidColorBrush
来说很有用:
var colorString = ...;
var converter = new System.Windows.Media.BrushConverter();
var brush = (SolidColorBrush)converter.ConvertFromString(colorString);
在.NET Reflector中查看SolidColorBrush
,在XamlReader
中进行反序列化的神奇之处似乎是使用围绕已知类型的内部API。我不确定你是否可以注册自己的类型来处理这个问题。