2017-09-18 5 views
1

Je possède ce code:Xamarin.Forms - Étiquette FontSize OnPlatform - Erreur XAML

<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> 

... et obtenez cette erreur:

No property, bindable property, or event found for FontSize 

Qu'est-ce que je fais mal?

Merci.

Répondre

2

Généralement, lorsque nous définissons FontSize="value", FontSizeConverter convertit en expected type (double) pour définir la valeur.

Mais il semble que ce convertisseur ne soit pas utilisé lorsque nous utilisons OnPlatform. Nous avons donc deux options:

  1. Utilisation OnPlatform avec x:Double comme argument de type.

    <OnPlatform x:TypeArguments="x:Double" 
        iOS="20" 
        Android="25" /> 
    
  2. Ou, duper le processeur XAML pour effectuer la conversion pour nous - nous pouvons le faire en utilisant l'extension de balisage StaticResource. Remarque:Cela ne fonctionne que si XAMLC n'est pas appliqué.

    <!-- 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. recommandé Extend Label avec NamedSize propriété liable et convertir à FontSize (essentiellement ce que l'FontSizeConverter fait).

    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> 
    

EDIT 1: Option 2 ne fonctionne que si XAMLC n'est pas appliquée.

EDIT 2: option Ajouter 3.

Note: Il y a un bug fix available in pre-release versions qui peut aussi être considéré comme une solution de rechange. Mais je n'ai pas été en mesure de confirmer si elle est corrigée dans la dernière version.

+0

Merci, mais la deuxième approche me donne cette erreur lors de l'exécution: \t System.InvalidCastException: spécifié est pas valide. – OPunktSchmidt

+0

@OPunktSchmidt: Réponse mise à jour avec une autre option. J'espère que cela aide! – Ada

1

Vous devriez essayer la nouvelle XAML pour 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>