手动解析字符串作为XAML属性

4
XAML解析器如何将Foreground="Red"中的字符串"Red"转换为SolidColorBrush?虽然我知道类型有System.ComponentModel.TypeConverter定义,但我怀疑WPF XAML解析器实际上并不总是使用它们来将字符串转换为画笔。除了需要有效xml字符串的XamlReader.Load之外,是否有任何XAML API可以用于解析单个字符串,就像它是某个属性的属性一样?
2个回答

0

XAML解析器(用于WPF)确实使用指定属性或属性类型的类型转换器。有一些硬编码的快捷方式,但它们是为了性能而存在的,并不改变语义。仅使用属性信息的解析器可以复制解析器语义(例如,Blend和Cider所做的就是这样)。

没有API可以像XAML一样精确地转换值,主要是因为许多类型转换器只在XAML解析的上下文中起作用。例如,类型转换器可以引用在XAML文件中定义的命名空间(这取决于值在XML文件中的位置),以及其他环境信息,如文件的基URI基础。这些只在解析XAML文件时才真正适用。

最接近的方法是从类型描述符请求属性的属性描述符并使用Converter属性。这将扫描适当的属性以创建正确的类型转换器。


-1

我相信你可以自己利用这个。XamlReader知道目标类型(必须应用字符串的属性的类型)。您将为该属性类型注册TypeConverter。

编辑:当涉及到SolidColorBrush时,这对您很有用:

var colorString = ...;
var converter = new System.Windows.Media.BrushConverter();
var brush = (SolidColorBrush)converter.ConvertFromString(colorString);

在.NET Reflector中查看SolidColorBrush,似乎在XamlReader内部使用已知类型的内部API进行反序列化的魔法。我不确定是否可以注册自己的类型来处理这个问题。


是的,这就是我目前的做法。但我注意到XamlReader并不总是使用TypeConverters来解析字符串。因此,除了这些TypeConverters之外,XamlReader必须有一些更多的逻辑用于解析。我的问题是,这个逻辑是否公开为API? - bitbonk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接