wpf 50可以< x:Double x:Key="fontsize">< /x:Double>转换成纯属性语法或纯元素语法吗?

cwtwac6a  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(132)

动机:

混合语法

<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关联的属性的名称。

r6hnlfcb

r6hnlfcb1#

若要通过属性或标记设置值,类型必须具有带公共setter的属性。并且您只能为这些属性赋值。
但是,若要将型别建立为内容中的值,该型别必须有String的转换子。
示例:
第一个
Double类型(与其他数字类型一样)没有属性。因此,无法通过数字的属性或标记设置值。

2sbarzqh

2sbarzqh2#

您已经接受了一个答案,但是如果您希望得到更简洁的答案,可以尝试使用MarkupExtension,它提供双精度值或其他强类型值

public class ValExtension<T> : MarkupExtension where T : struct
{
    protected ValExtension(T val) => Value = val;
    private object Value { get; }
    public override object ProvideValue(IServiceProvider sp) { return Value; }
}
public class DoubleValExtension : ValExtension<double>
{
    public DoubleValExtension(double v) : base(v) {}
}

我发现这在任何我不想依赖于隐式类型转换的地方都很有用,比如绑定中的值转换器ConverterParameter。由于ConverterParameter只是一个对象,仅仅把“0.3”放进去并不会导致实际的转换器得到一个双精度值。
例如,假设我有一个转换器,它接受Category枚举和一个可选的double参数来调整计算值,我可以使用标记扩展来强制XAML传递一个boxed double。

Opacity="{Binding SelectedItem.Category,
                  Converter={StaticResource ConvertCategoryToOpacity},
                  ConverterParameter={local:DoubleVal 0.3}

如果我尝试这样做,转换器只会得到一个未转换的字符串。

Opacity="{Binding SelectedItem.Category,
                  Converter={StaticResource ConvertCategoryToOpacity},
                  ConverterParameter='0.3'}"

在某些情况下,这可能是好的,但如果我的转换器指望检查参数的类型,就不行了。
您也可以从其他POD类型的泛型派生。

public class IntValExtension  : ValExtension<int>  { public IntValExtension(int v)   : base(v) {} }
public class BoolValExtension : ValExtension<bool> { public BoolValExtension(bool v) : base(v) {} }

相关问题