初始化 Xamarin Forms 时未应用文本样式

Text Style not applied when Xamarin Forms is initialized

我有一个 UWP 应用并试用了 Embedded Xamarin Forms。嵌入本身到目前为止有效。但是我注意到某些 TextStyles 在我初始化 Forms 后不再起作用。

没有表格:

Forms.Init之后:

唯一不同的是 App.xaml.cs 中的这一行:

Xamarin.Forms.Forms.Init(e);

文本块的代码是:

<TextBlock x:Name="TitlePage"
                   Text="Hello"
                   Style="{StaticResource PageTitleStyle}" />

风格:

<Style x:Key="PageTitleStyle"
       TargetType="TextBlock">
    <Setter Property="VerticalAlignment"
            Value="Center" />
    <Setter Property="FontWeight"
            Value="SemiLight" />
    <Setter Property="FontSize"
            Value="{StaticResource LargeFontSize}" />
    <Setter Property="TextTrimming"
            Value="CharacterEllipsis" />
    <Setter Property="TextWrapping"
            Value="NoWrap" />
    <Setter Property="Margin"
            Value="{StaticResource PageTitleMargin}" />
</Style>

我创建了一个您可以在此处找到的最小示例:https://github.com/NPadrutt/EmbeddedFormsTest

版本:

当你执行Xamarin.Forms.Forms.Init(e);时,它会加载在Xamarin.xml中定义的ResourceDictionary。因此,在调用此代码行后,文本可能会显示 Xamarin Forms 中定义的样式,而不是您在 UWP 中定义的样式。详情可以查看Init方法的代码片段。

更新:

Init 方法通过此代码行合并样式

return new Windows.UI.Xaml.ResourceDictionary {
Source = new Uri("ms-appx:///Xamarin.Forms.Platform.UAP/Resources.xbf")

你会在Xamarin的Resource.xaml中找到如下样式。

<Style x:Key="PageTitleStyle" TargetType="TextBlock">
    <Setter Property="FontWeight" Value="Bold" />
</Style>

它与您定义的 x:key (PageTitleStyle) 相同,因此您的样式将被覆盖。 只需要改变你的风格x:key它不会受到Xamarin资源的影响,例如PageTitleStyle2.

如果您想使用您在 UWP 应用程序中为 Xamarin Forms 定义的样式,您可以使用 Custom Renderers. TextBlock is the native control for UWP, the correspondent control in Xamarin Forms is Label. Details please see Renderer Base Classes and Native Controls。您应该在 Xamarin Forms 中有一个 Label 控件,并为 Label 创建一个自定义渲染器,并在 UWP 中设置目标类型为 TextBlock 的样式。例如:

public class MyLabelRenderer : LabelRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);
        Control.Style= (Windows.UI.Xaml.Style)App.Current.Resources["PageTitleStyle"];
    }
}

有关更多示例,您可以参考 this