动机:
混合语法
<Label FontSize="50">Hello</Label>
可以转换为纯属性语法,
<Label Text="Hello" FontSize="50"/>
或纯元素语法
<Label>
<Label.Text>Hello</Label.Text>
<Label.FontSize>50</Label.FontSize>
</Label>
问题:
我们还能把<x:Double x:Key="fontsize">50</x:Double>
转换成纯属性语法和纯元素语法吗?
在我的尝试中,我找不到与50
关联的属性的名称。
2条答案
按热度按时间r6hnlfcb1#
若要通过属性或标记设置值,类型必须具有带公共setter的属性。并且您只能为这些属性赋值。
但是,若要将型别建立为内容中的值,该型别必须有String的转换子。
示例:
第一个
Double类型(与其他数字类型一样)没有属性。因此,无法通过数字的属性或标记设置值。
2sbarzqh2#
您已经接受了一个答案,但是如果您希望得到更简洁的答案,可以尝试使用
MarkupExtension
,它提供双精度值或其他强类型值我发现这在任何我不想依赖于隐式类型转换的地方都很有用,比如绑定中的值转换器
ConverterParameter
。由于ConverterParameter
只是一个对象,仅仅把“0.3”放进去并不会导致实际的转换器得到一个双精度值。例如,假设我有一个转换器,它接受
Category
枚举和一个可选的double参数来调整计算值,我可以使用标记扩展来强制XAML传递一个boxed double。如果我尝试这样做,转换器只会得到一个未转换的字符串。
在某些情况下,这可能是好的,但如果我的转换器指望检查参数的类型,就不行了。
您也可以从其他POD类型的泛型派生。