初始化 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
版本:
- 对比 15.5.2
- Xamarin.Forms 2.5.0.121934
- Microsoft.NETCore.UniversalWindowsPlatform6.0.5
当你执行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。
我有一个 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
版本:
- 对比 15.5.2
- Xamarin.Forms 2.5.0.121934
- Microsoft.NETCore.UniversalWindowsPlatform6.0.5
当你执行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。