我有以下代码:

  <Label x:Name="questionGroupHintInfoLabel" FontAttributes="Bold"  Text="Folgende Hinweismeldung wurde für die aktuelle Fragengruppe hinterlegt:">
      <Label.FontSize>
        <OnPlatform x:TypeArguments="NamedSize"
                    iOS="Small"
                    Android="Small" />
      </Label.FontSize>
    </Label>


...并得到此错误:

No property, bindable property, or event found for FontSize


我做错了什么?

谢谢。

最佳答案

通常,当我们设置FontSize="value"时,FontSizeConverter会转换为expected type(即double)来设置值。

但是,当我们使用OnPlatform时,似乎未使用此转换器。因此,我们有两种选择:


OnPlatformx:Double用作类型参数。

<OnPlatform x:TypeArguments="x:Double"
    iOS="20"
    Android="25" />

或者,欺骗XAML处理器为我们进行转换-我们可以使用StaticResource标记扩展名来进行转换。注意:这仅在未应用XAMLC的情况下有效。

<!-- App.Resources or ContentPage.Resources -->
<ResourceDictionary>
    <OnPlatform x:Key="FontNamedSize" x:TypeArguments="x:String"
        iOS="Small"
        Android="Large" />
</ResourceDictionary>

<!-- now you can use static-resource extension to use above defined value -->
<Label x:Name="questionGroupHintInfoLabel"
       FontAttributes="Bold"
       Text="Folgende Hinweismeldung wurde für die aktuelle Fragengruppe hinterlegt:"
       FontSize="{StaticResource FontNamedSize}" />

建议使用Label可绑定属性扩展NamedSize并转换为FontSize(基本上是FontSizeConverter的功能)。

public class ExLabel : Label
{
    public static readonly BindableProperty FontNamedSizeProperty =
        BindableProperty.Create(
            "FontNamedSize", typeof(NamedSize), typeof(ExLabel),
            defaultValue: default(NamedSize), propertyChanged: OnFontNamedSizeChanged);

    public NamedSize FontNamedSize
    {
        get { return (NamedSize)GetValue(FontNamedSizeProperty); }
        set { SetValue(FontNamedSizeProperty, value); }
    }

    private static void OnFontNamedSizeChanged(BindableObject bindable, object oldValue, object newValue)
    {
        ((ExLabel)bindable).OnFontNamedSizeChangedImpl((NamedSize)oldValue, (NamedSize)newValue);
    }

    protected virtual void OnFontNamedSizeChangedImpl(NamedSize oldValue, NamedSize newValue)
    {
        FontSize = Device.GetNamedSize(FontNamedSize, typeof(Label));
    }
}

<!-- Usage -->
<local:ExLabel HorizontalOptions="Center" VerticalOptions="Center" Text="This is a custom label">
    <local:ExLabel.FontNamedSize>
        <OnPlatform x:TypeArguments="NamedSize"
            iOS="Large"
            Android="Medium" />
    </local:ExLabel.FontNamedSize>
</local:ExLabel>



编辑1:选项2仅在未应用XAMLC的情况下有效。

编辑2:添加选项3。

注意:有一个bug fix available in pre-release versions也可以视为替代解决方案。但是我无法确认它是否在最新版本中已修复。

08-04 11:53