第12章 样式(六)

简介: 设备样式 Xamarin.Forms包含六种内置动态样式。 这些被称为设备样式,它们是名为Styles的嵌套类的成员。 这个Styles类定义了12个静态和只读字段,有助于在代码中引用这六个样式: Style样式的BodyStyle。

设备样式

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

目录
相关文章
|
6月前
|
缓存 前端开发
样式
样式
60 3
|
6月前
|
前端开发
CSS 滚动条样式修改
CSS 滚动条样式修改
75 0
|
3月前
|
前端开发
行内样式和内部样式
【8月更文挑战第24天】行内样式和内部样式。
29 2
|
前端开发
CSS 修改滚动条样式
CSS 修改滚动条样式
86 0
实现简易手风琴样式
蓝桥最新一期的楼赛是实现手风琴样式,这个我们可以考虑到几个解决方案,我们先来看题
89 1
实现简易手风琴样式
|
前端开发
CSS边框样式详解
border-color属性用于定义边框的颜色 简写形式: 想要为一个元素定义边框,我们需要完整地给出border-width、border-style和bordercolor。这种写法代码量过多,费时费力。不过CSS为我们提供了一种简写形式
123 0
CSS边框样式详解
|
前端开发
常用样式
常用样式
117 0
|
前端开发
CSS如何修改滚动条的样式?
CSS如何修改滚动条的样式?
128 0
|
Web App开发 前端开发
如何自定义CSS滚动条的样式?
原文:如何自定义CSS滚动条的样式? 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表 本文会介绍CSS滚动条选择器,并在demo中展示如何在Webkit内核浏览器和IE浏览器中,自定义一个横向以及一个纵向的滚动条。
1235 0
|
JavaScript Android开发 iOS开发