第12章 样式(六)

设备样式

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会产生相同的样式,但每个平台都以不同的方式实现这些设备样式:
2018_08_13_080658
iOS上可以轻松演示这些样式的动态特性:在DeviceStyles程序运行时,点击“主页”按钮并运行“设置”。 选择常规项,然后选择辅助功能和更大的文本。 可以使用滑块使文本变小或变大。 更改该滑块,双击“主页”按钮以显示当前应用程序,然后再次选择“DeviceStyles”。 您将看到设备样式中的文本集(或从设备样式派生的样式)会更改大小,但应用程序中没有任何未设置样式的文本会更改大小。 新对象已替换字典中的设备样式。
设备样式的动态特性在Android上并不那么明显,因为更改“设置”中“显示”部分的“字体大小”项会影响Xamarin.Forms程序中的所有字体大小。
在Windows 10移动设备上,“设置的轻松访问”和“更多选项”部分中的“文本缩放”项也会影响所有文本。
下一章包括一个程序,演示如何制作一个小电子书阅读器,让您阅读爱丽丝梦游仙境的一章。 此程序使用设备样式来控制所有文本的格式,包括书籍和章节标题。
但是这个小电子书阅读器还包括插图,这需要探索位图的主题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值