[UWP]如何使用Fluent Design System (上)

1. 前言

微软在Build
2017
中公布了新的规划语言Fluent
Design
System(以下简称FDS),可是官网只是堆砌了种种华丽的辞藻以及一堆动画。至于在UWP中要做成什么,如何做,可以参照这几个录像:
Build Amazing Apps with Fluent Design – Build
2017

视频中动用BuildCast那个示例应用详细体现了Fall
Creators Update(16299)中如何达成FDS以及其余FCU的新API,极具参考价值。
图片 1

或者参考开发人少尉网,那里详细介绍了FDS的五大骨干宗旨(Material(材质)、Light(光照)、Depth(深度)、Motion(动态)和
Scale(伸缩性))相关职能及使用正规。

恍如没看到专门提须要规划人士的FDS指南?

2. Fall Creators Update中的Fluent Design System

正文紧要介绍微软在Fall Creators Update中主打的各类FDS特效、控件。

2.1 Material

材料是FDS最有趣的宗旨,以往主推的Metro强调去材质化,现在又重新提把材料捡回来。然而当下FDS中材料的运用场景有明确规定,并不是和之前材质化泛滥时一致连具有按钮都材质化。从材质的回归可以看出UWP的承接主体已经从显示器延伸到MR。

Acrylic是当前FDS主打的材料。在Fall
Creators
Update此前统计器等多少个使用已经用上了这几个特效,效果看起来还不易。Acrylic除了负责突显材质化的作用,还承担营造有深度的UI。简单的讲Acrylic只是一个Brush,UWP提供了一组Acrylic
Brush给开发者使用,通过ThemeResource找到资源名字中富含“Acrylic”的Brush即可轻松在动用中动用Acrylic,代码如下:

<Grid Background="{ThemeResource SystemControlAcrylicElementBrush}">

Acrylic包罗三种。

  • Background acrylic
    透视整个应用UI,可以看出选取窗体后的此外应用或桌面(在ThemeResource中名称包括-AcrylicWindow-)。
    图片 2

  • In-app acrylic 只透视套用了acrylic
    brush的要素(在ThemeResource中名称包括 -AcrylicElement-)。
    图片 3

2.2 Light

UWP使用CompositionLight可以制作过多很有意思的德州效果,FDS主打的光照特效是Reveal,在FCU中大部Items
Control(ListView、GridView等)都默许启用了Reveal特效,一些Button控件也可以经过套用Style启用那么些特效。

<Button Content="Button Content" Style="{StaticResource ButtonRevealStyle}"/>

图片 4

Reveal最大的性状是鼠标靠近时控件的边框会被照亮,那对于无边框按钮或ListViewItem可以在不损坏其简要设计的前提下提示其可操作区域。(或许在MR中Reveal有更加多的采纳场景。)

2.3 Depth

就是在强调扁平化的时日,深度仍是设计师关切的一个大旨。FCU中除去选择Acrylic营造有深度的UI,还新增了ParallaxView控件,可以创立简单的视差滚动效应。

<ParallaxView x:Name="parallaxView"
              Source="{Binding ElementName=listView}"
              VerticalAlignment="Top"
              HorizontalAlignment="Left"
              VerticalShift="50">
    <Image Source="ms-appx:///Assets/cliff.jpg" />
</ParallaxView>
<ListView x:Name="listView"
          HorizontalAlignment="Stretch"
          VerticalAlignment="Top"
          Background="#80000000">
    <x:String>Item 1</x:String>
    <x:String>Item 2</x:String>
    <x:String>Item 3</x:String>
    ...
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}"
                       Foreground="White" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

图片 5

2.4 Motion

UWP控件自带的动画片已经重重,Connected
animations
则更进一步。Connected
animations平时用于在导航中指导视觉,定位操作对象。

图片 6

比起默许的写法,我更喜欢UWP Community Toolkit封装好的 Connected
Animations
附加属性
。只需在源页面和目标页面的操作对象使用同一的Connected.Key即可轻松已毕Connected
animations。

MotionPage.xaml

<Border Height="100"
        Width="100"
        Background="{ThemeResource SystemControlForegroundAccentBrush}"
        VerticalAlignment="Center"
        HorizontalAlignment="Center"
        animations:Connected.Key="item"
        Tapped="Border_Tapped" />

MotionPage.xaml.cs

navigationService.NavigateToPage<ConnectedAnimations2ndPage>();

ConnectedAnimations2ndPage.xaml

<Border x:Name="HeroElement"
        Height="300" 
        Width="300"
        Background="{ThemeResource SystemControlForegroundAccentBrush}"
        animations:Connected.Key="item"/>

图片 7

2.5 Scale

在FDS中,伸缩性那几个要旨比较特殊。它没有主打的控件或API,不难地领略成适应种种屏幕尺寸的响应式设计也能够,但自身更乐于将它的宏旨明白成设计能够在0D到3D的花样中拉开,即可以适应从言语到鼠标、键盘、触摸、MR等各样花样的输入和输出。

图片 8

对设计师和开发人士来说那一个宗旨可能不太好玩儿,毕竟它看起来只是累赘,一点都不豪华。但自己以为重申这几个大旨格外首要,UWP诞生的目的就是为着制作能在种种装备上运行的通用应用,伸缩性对UWP至关首要。即便只针对桌面设备,能有种种输入格局对可用性都有很大升高。可惜随着近期运动系统的风靡,设计师越来越习惯设计只针对触摸的UI,连带影响到桌面应用,连忙键越来越少,有些设计师甚至拒绝提供按钮的PointerOver效果。希望随着设计规范及控件的不偏不党那一个题材能有所改革吧。

3. 在Fall Creators Update中提高使用

在Fall Creators Update中只须要修改导航及标题栏,应用的UI即可有大幅进步。

图片 9

3.1 使用NavigationView更新导航菜单

开首很多学科都专门讲解了怎么制作拉各斯包菜单,现在UWP终于提供了默许方案。NavigationView是Fall
Creators
Update提供的新导航菜单,它接纳了FDS最常用的五个特效:Acrylic和Reveal,可以折叠及最小化,使用简易:

<NavigationView IsSettingsVisible="True"
                x:Name="NavigationView"
                AlwaysShowHeader="False"
                ItemInvoked="NavigationView_ItemInvoked"
                x:FieldModifier="Public">
    <NavigationView.MenuItems>
        <NavigationViewItem Content="Material"
                            IsSelected="True">
            <NavigationViewItem.Icon>
                <FontIcon FontFamily="Segoe MDL2 Assets"
                          Glyph="&#xF126;" />
            </NavigationViewItem.Icon>
        </NavigationViewItem>
        <NavigationViewItem Content="Light">
            <NavigationViewItem.Icon>
                <FontIcon FontFamily="Segoe MDL2 Assets"
                          Glyph="&#xF126;" />
            </NavigationViewItem.Icon>
        </NavigationViewItem>
        <NavigationViewItem Content="Motion">
            <NavigationViewItem.Icon>
                <FontIcon FontFamily="Segoe MDL2 Assets"
                          Glyph="&#xF126;" />
            </NavigationViewItem.Icon>
        </NavigationViewItem>
        <NavigationViewItem Content="Depth">
            <NavigationViewItem.Icon>
                <FontIcon FontFamily="Segoe MDL2 Assets"
                          Glyph="&#xF126;" />
            </NavigationViewItem.Icon>
        </NavigationViewItem>
        <NavigationViewItem Content="Scale">
            <NavigationViewItem.Icon>
                <FontIcon FontFamily="Segoe MDL2 Assets"
                          Glyph="&#xF126;" />
            </NavigationViewItem.Icon>
        </NavigationViewItem>
    </NavigationView.MenuItems>
    <Frame x:Name="RootFrame"
           Navigated="RootFrame_Navigated">
    </Frame>
</NavigationView>

3.2 将内容伸张到标题栏

在程序启动或每一遍变更要旨颜色时调用SetupTitlebar()本条函数,注意要根据当前主旨颜色改变TitleBar上按钮的颜料(因为官方文档上尚无,所以众多少人会忘了处理按钮的颜料):

private static void SetupTitlebar()
{
    if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.ApplicationView"))
    {
        var titleBar = ApplicationView.GetForCurrentView().TitleBar;
        if (titleBar != null)
        {
            titleBar.ButtonBackgroundColor = Colors.Transparent;
            if (TrueTheme() == ElementTheme.Dark)
            {
                titleBar.ButtonForegroundColor = Colors.White;
                titleBar.ForegroundColor = Colors.White;
            }
            else
            {
                titleBar.ButtonForegroundColor = Colors.Black;
                titleBar.ForegroundColor = Colors.Black;
            }

            titleBar.BackgroundColor = Colors.Black;

            titleBar.ButtonInactiveBackgroundColor = Colors.Transparent;
            titleBar.ButtonInactiveForegroundColor = Colors.LightGray;

            CoreApplicationViewTitleBar coreTitleBar = TitleBarHelper.Instance.TitleBar;

            coreTitleBar.ExtendViewIntoTitleBar = true;
        }
    }
}

public static ElementTheme TrueTheme()
{
    var frameworkElement = Window.Current.Content as FrameworkElement;
    return frameworkElement.ActualTheme;
}

主页中采纳TextBlock代替应用标题:

<TextBlock x:Name="WindowTitle"
           Style="{ThemeResource CaptionTextBlockStyle}"
           Visibility="{x:Bind TitleHelper.TitleVisibility, Mode=OneWay}"
           Margin="{x:Bind TitleHelper.TitlePosition, Mode=OneWay}"
           VerticalAlignment="Top"
           Text="{x:Bind appmodel:Package.Current.DisplayName}" />

本人自己的ColorfulBox应用在应用上述方案升级后外观有了广大纠正(请忽略标题没有垂直居中那一个小错误):

图片 10

(待续…)

相关文章