设备样式
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=""
-
xmlns:x=""
-
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移动设备上,“设置的轻松访问”和“更多选项”部分中的“文本缩放”项也会影响所有文本。
下一章包括一个程序,演示如何制作一个小电子书阅读器,让您阅读爱丽丝梦游仙境的一章。 此程序使用设备样式来控制所有文本的格式,包括书籍和章节标题。
但是这个小电子书阅读器还包括插图,这需要探索位图的主题。
阅读(2813) | 评论(0) | 转发(0) |