设备样式
Xamarin.Forms包含六种内置动态样式。 这些被称为设备样式,它们是名为Styles的嵌套类的成员。 这个Styles类定义了12个静态和只读字段,有助于在代码中引用这六个样式:
- Style样式的BodyStyle。
- 类型为String的BodyStyleKey,等于“BodyStyle”。
- Ttyle类型的TitleStyle。
- Tord类型为String的StyleStyleKey,等于“TitleStyle”。
- 类型为Style的SubtitleStyle。
- 字符串类型的SubtitleStyleKey,等于“SubtitleStyle”。
- 类型为Style的CaptionStyle。
- 字符串类型的CaptionStyleKey,等于“CaptionStyle”。
- Ttyle类型的ListItemTextStyle。
- List类型的ListItemTextStyleKey,等于“ListItemTextStyle”。
- Style的ListItemDetailTextStyle。
- List类型的ListItemDetailTextStyleKey,等于“ListItemDetailTextStyle”。
所有六种样式都具有LabelType的TargetType并存储在字典中 - 但不是应用程序可以直接访问的字典。
在代码中,您可以使用此列表中的字段来访问设备样式。 例如,您可以将Device.Styles.BodyStyle对象直接设置为Label的Style属性,以用于可能适合段落主体的文本。 如果您在代码中定义了一种源自其中一种设备样式的样式,请将BaseResourceKey设置为Device.Styles.BodyStyleKey,或者如果您不怕拼写错误,则将其设置为“BodyStyle”。
在XAML中,您只需使用带有DynamicResource的文本键“BodyStyle”将此样式设置为Label的Style属性,或者在从De?vice.Styles.BodyStyle派生样式时设置BaseResourceKey。
DeviceStylesList程序演示了如何访问这些样式 - 以及在XAML和代码中定义从SubtitleStyle继承的新样式。 这是XAML文件:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DeviceStylesList.DeviceStylesListPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness"
iOS="10, 20, 10, 0"
Android="10, 0"
WinPhone="10, 0" />
</ContentPage.Padding>
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="newSubtitleStyle" TargetType="Label"
BaseResourceKey="SubtitleStyle">
<Setter Property="TextColor" Value="Accent" />
<Setter Property="FontAttributes" Value="Italic" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ScrollView>
<StackLayout Spacing="20">
<!-- Device styles set with DynamicResource -->
<StackLayout>
<StackLayout HorizontalOptions="Start">
<Label Text="Device styles set with DynamicResource" />
<BoxView Color="Accent" HeightRequest="3" />
</StackLayout>
<Label Text="No Style whatsoever" />
<Label Text="Body Style"
Style="{DynamicResource BodyStyle}" />
<Label Text="Title Style"
Style="{DynamicResource TitleStyle}" />
<Label Text="Subtitle Style"
Style="{DynamicResource SubtitleStyle}" />
<!-- Uses style derived from device style. -->
<Label Text="New Subtitle Style"
Style="{StaticResource newSubtitleStyle}" />
<Label Text="Caption Style"
Style="{DynamicResource CaptionStyle}" />
<Label Text="List Item Text Style"
Style="{DynamicResource ListItemTextStyle}" />
<Label Text="List Item Detail Text Style"
Style="{DynamicResource ListItemDetailTextStyle}" />
</StackLayout>
<!-- Device styles set in code -->
<StackLayout x:Name="codeLabelStack">
<StackLayout HorizontalOptions="Start">
<Label Text="Device styles set in code:" />
<BoxView Color="Accent" HeightRequest="3" />
</StackLayout>
</StackLayout>
</StackLayout>
</ScrollView>
</ContentPage>
StackLayout包含两个Label和BoxView组合(一个位于顶部,一个位于bot?tom)以显示带下划线的标题。 在第一个标题之后,Label元素使用DynamicResource引用设备样式。 新的字幕样式在页面的Resources字典中定义。
代码隐藏文件通过使用Device.Styles类中的属性访问设备样式,并通过从SubtitleStyle派生来创建新样式:
public partial class DeviceStylesListPage : ContentPage
{
public DeviceStylesListPage()
{
InitializeComponent();
var styleItems = new[]
{
new { style = (Style)null, name = "No style whatsoever" },
new { style = Device.Styles.BodyStyle, name = "Body Style" },
new { style = Device.Styles.TitleStyle, name = "Title Style" },
new { style = Device.Styles.SubtitleStyle, name = "Subtitle Style" },
// Derived style
new { style = new Style(typeof(Label))
{
BaseResourceKey = Device.Styles.SubtitleStyleKey,
Setters =
{
new Setter
{
Property = Label.TextColorProperty,
Value = Color.Accent
},
new Setter
{
Property = Label.FontAttributesProperty,
Value = FontAttributes.Italic
}
}
}, name = "New Subtitle Style" },
new { style = Device.Styles.CaptionStyle, name = "Caption Style" },
new { style = Device.Styles.ListItemTextStyle, name = "List Item Text Style" },
new { style = Device.Styles.ListItemDetailTextStyle,
name = "List Item Detail Text Style" },
};
foreach (var styleItem in styleItems)
{
codeLabelStack.Children.Add(new Label
{
Text = styleItem.name,
Style = styleItem.style
});
}
}
}
当然,代码和XAML会产生相同的样式,但每个平台都以不同的方式实现这些设备样式:
iOS上可以轻松演示这些样式的动态特性:在DeviceStyles程序运行时,点击“主页”按钮并运行“设置”。 选择常规项,然后选择辅助功能和更大的文本。 可以使用滑块使文本变小或变大。 更改该滑块,双击“主页”按钮以显示当前应用程序,然后再次选择“DeviceStyles”。 您将看到设备样式中的文本集(或从设备样式派生的样式)会更改大小,但应用程序中没有任何未设置样式的文本会更改大小。 新对象已替换字典中的设备样式。
设备样式的动态特性在Android上并不那么明显,因为更改“设置”中“显示”部分的“字体大小”项会影响Xamarin.Forms程序中的所有字体大小。
在Windows 10移动设备上,“设置的轻松访问”和“更多选项”部分中的“文本缩放”项也会影响所有文本。
下一章包括一个程序,演示如何制作一个小电子书阅读器,让您阅读爱丽丝梦游仙境的一章。 此程序使用设备样式来控制所有文本的格式,包括书籍和章节标题。
但是这个小电子书阅读器还包括插图,这需要探索位图的主题。