我有这段代码:
<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
我做错了什么?
感谢。
答案 0 :(得分:4)
通常,当我们设置FontSize="value"
时,FontSizeConverter
会转换为expected type(double
)来设置值。
但是当我们使用OnPlatform
时,看起来不会使用此转换器。所以我们有两个选择:
将OnPlatform
与x: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也可以视为替代修复。但是我还没有确认它是否在最新版本中得到修复。
答案 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>