Xamarin.Forms - 标签FontSize OnPlatform - XAML错误

时间:2017-09-18 07:42:41

标签: c# xamarin xamarin.ios xamarin.forms xamarin.android

我有这段代码:

  <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

我做错了什么?

感谢。

3 个答案:

答案 0 :(得分:4)

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

但是当我们使用OnPlatform时,看起来不会使用此转换器。所以我们有两个选择:

  1. OnPlatformx:Double一起用作类型参数。

    <OnPlatform x:TypeArguments="x:Double"
        iOS="20"
        Android="25" />
    
  2. 或者,欺骗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}" />
    
  3. 推荐使用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>
    
  4. 编辑1: 选项2仅在未应用XAMLC时有效。

    编辑2: 添加选项3.

    注意:还有一个bug fix available in pre-release versions也可以视为替代修复。但是我还没有确认它是否在最新版本中得到修复。

答案 1 :(得分:2)

旧线程,但是当我发现这种语法时,我就接近实现上述答案中的第3项了。

<Style TargetType="Button" x:Key="ListButtonStyle">
       <Setter Property="FontSize" Value="{OnIdiom Phone={OnPlatform Android=Header, iOS=Micro} , Tablet=Large, Desktop=Default}" />
</Style>

在装有ios和android的手机上对其进行了检查,并且运行良好。 决定把它留在这里。 xamarin.forms 4.8.0.1687

答案 2 :(得分:0)

您应该尝试使用新的XAML for OnPlatform:

<!--Old XAML On Platform-->
<StackLayout>
  <StackLayout.Padding>
    <OnPlatform x:TypeArguments="Thickness" 
                Android="0, 0, 0, 0" 
                WinPhone="0, 0, 0, 0" 
                iOS="0, 20, 0, 0"/>
  </StackLayout.Padding>
</StackLayout>

<!--New XAML On Platform-->
<StackLayout>
  <StackLayout.Padding>
   <OnPlatform x:TypeArguments="Thickness">
     <On Platform="Android" Value="0, 0, 0, 0"/>
     <On Platform="WinPhone" Value="0, 0, 0, 0"/>
     <On Platform="iOS" Value="0, 20, 0, 0"/>
    </OnPlatform>
  </StackLayout.Padding>
</StackLayout>

<!--Better new XAML On Platform-->
<StackLayout>
  <StackLayout.Padding>
   <OnPlatform x:TypeArguments="Thickness">
     <On Platform="Android, WinPhone">0</On>
     <On Platform="iOS">0,20,0,0</On>
    </OnPlatform>
  </StackLayout.Padding>
</StackLayout>