使用XAML在onplatform中使用namedSize

时间:2017-01-04 14:24:25

标签: c# visual-studio xaml xamarin.forms

我正在尝试使用特定大小的每个平台的标签字体,只使用XAML。这段代码工作正常:

<Label x:Name="DescricaoLabel"
               Grid.Row="1"
               Grid.Column="0"
               HorizontalTextAlignment="Start"
               Text="{Binding Descricao}"
               TextColor="#426d76">
            <Label.Font>
                <OnPlatform x:TypeArguments="Font"
                            Android="14"
                            iOS="Micro" />
            </Label.Font>
</Label> 

但是,标记Label.Font被标记为已过时。我试过这个:

<Label.FontSize>
         <OnPlatform x:TypeArguments="x:Double"
                         Android="14"
                         iOS="Micro" />
</Label.FontSize>

但是使用标签Label.FontSize我无法编译,因为使用了NamedSize'Micro'。

在XAML中使用double和NamedSize并且不使用过时标记的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

类型必须属于同一类型。在默认值中,您不能同时具有命名大小和双精度。

NamedSize通过内置的静态转换器工作。您可以编写自己的转换器,也可以将它们作为字符串然后转换。或者使用带参数的转换器并指定值和类型。

默认值不会处理您尝试实现的方案。

public class StringToSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    {
        double size;
        if(double.TryParse(value.ToString, out size))
        {
            //this is a double
            return size;            
        }    
        // its a named size, so convert the named size to enum
       NamedSize namedSize;
       if (Enum.TryParse(value.ToString, true, out namedSize))
       {
            return Device.GetNamedSize(NamedSize.Default, typeof(Label));
       }    
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

您可以在下面详细了解转换器:

另一种替代方法是在app.cs或app.xaml.cs中定义一个命名标签样式,并设置字体大小并在XAML中使用该样式。在这种情况下,您不需要在XAML中使用OnPlatform,它将在您的CS文件中。