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

来源:https://www.cnblogs.com/dino623/archive/2018/01/09/FluentDesignSystem.html
-Advertisement-
Play Games

1. 前言 微軟在 "Build 2017" 中公佈了新的設計語言Fluent Design System(以下簡稱FDS),不過 "官網" 只是堆砌了各種華麗的詞語以及一堆動畫。至於在UWP中要做成怎麼樣,怎麼做,可以參考這個視頻: "Build Amazing Apps with Fluent ...


1. 前言

微軟在Build 2017中公佈了新的設計語言Fluent Design System(以下簡稱FDS),不過官網只是堆砌了各種華麗的詞語以及一堆動畫。至於在UWP中要做成怎麼樣,怎麼做,可以參考這個視頻:
Build Amazing Apps with Fluent Design - Build 2017

視頻中使用BuildCast這個示例應用詳細展示了Fall Creators Update(16299)中如何實現FDS以及其它FCU的新API,極具參考價值。

或者參考開發人員官網,這裡詳細介紹了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-)。

  • In-app acrylic 只透視套用了acrylic brush的元素(在ThemeResource中名稱包含 -AcrylicElement-)。

2.2 Light

UWP使用CompositionLight可以製造很多很有趣的光照效果,FDS主打的光照特效是Reveal,在FCU中大部分Items Control(ListView、GridView等)都預設啟用了Reveal特效,一些Button控制項也可以通過套用Style啟用這個特效。

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

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>

2.4 Motion

UWP控制項自帶的動畫已經不少,Connected animations則更進一步。Connected animations通常用於在導航中引導視覺,定位操作對象。

比起預設的寫法,我更喜歡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"/>

2.5 Scale

在FDS中,伸縮性這個主題比較特殊。它沒有主打的控制項或API,簡單地理解成適應各種屏幕尺寸的響應式設計也可以,但我更願意將它的主旨理解成設計可以在0D到3D的形式中延伸,即可以適應從語言到滑鼠、鍵盤、觸摸、MR等各種形式的輸入和輸出。

對設計師和開發人員來說這個主題可能不太有趣,畢竟它看起來只是繁瑣,一點都不華麗。但我覺得重申這個主題十分重要,UWP誕生的目的就是為了打造能在各種設備上運行的通用應用,伸縮性對UWP至關重要。即使只針對桌面設備,能有各種輸入方式對可用性都有很大提高。可惜隨著最近移動系統的流行,設計師越來越習慣設計只針對觸摸的UI,連帶影響到桌面應用,快捷鍵越來越少,有些設計師甚至拒絕提供按鈕的PointerOver效果。希望隨著設計規範及控制項的完善這個問題能有所改善吧。

3. 在Fall Creators Update中升級應用

在Fall Creators Update中只需要修改導航及標題欄,應用的UI即可有大幅提升。

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應用在使用上述方案升級後外觀有了不少改善(請忽略標題沒有垂直居中這個小錯誤):

(待續...)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. python特性(來自百度百科) 1) 解釋性:一個用編譯性語言比如C或C++寫的程式可以從源文件(即C或C++語言)轉換到一個你的電腦使用的語言(二進位代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。 運行程式的時候,連接/轉載器軟體把你的程式從硬碟複製到記憶體中並且運行。而Py ...
  • 本文只討論二維空間中的曼哈頓距離與切比雪夫距離 曼哈頓距離 定義 設平面空間記憶體在兩點,它們的坐標為$(x1,y1)$,$(x2,y2)$ 則$dis=|x1-x2|+|y1-y2|$ 即兩點橫縱坐標差之和 煮個慄子 如圖所示,圖中$A,B$兩點的曼哈頓距離為$AC+BC=4+3=7$ 切比雪夫距離 ...
  • 前言: 之前將各層都拆分出去, 作為一個獨立的可替換的子模塊. 感覺比以前確實是靈活了一些. 不管是電商項目, 還是現在公司做的項目, 其中, 有很多的業務邏輯, 都是一樣的, 但是由於不在一個系統中, 大家需要進行重覆的工作. 有的拷貝還好, 但是有的, 沒法直接拷貝. 相當的蛋疼. 能不能, 將 ...
  • Dubbo簡介: Dubbo 是阿裡巴巴公司開源(以前不開源)的一個高性能優秀的服務框架, 使得應用可通過高性能的 RPC 實現服務的輸入和輸出功能, 可以和spring框架無縫集成. 那麼這裡, 啥是RPC啊? 這麼來說吧, 業務邏輯層和展現層不在同一臺電腦上, 甚至不在同一個城市, 當我展現層想 ...
  • 存在性和唯一性的證明以後再補。。。。 拉格朗日插值 拉格朗日插值,emmmm,名字挺高端的:joy: 它有什麼應用呢? 我們在FFT中講到過 設$n-1$次多項式為 $y=\sum_{i=0}^{n-1}a_i x^i$ 有一個顯然的結論:如果給定$n$個互不相同的點$(x,y)$,則該$n-1$次 ...
  • 游戲中角色擁有的屬性值很多,運營多年的游戲,往往會有很多個成長線,每個屬性都有可能被N個成長線模塊增減數值。舉例當角色戴上武器時候hp+100點,卸下武器時HP-100點,這樣加減邏輯只有一處還比較好控制,如果某天有個特殊功能當被某技能攻擊時,角色武器會被擊落,這樣就會出現減數值的操作不止一處。如果... ...
  • 一、課程介紹 今天阿笨給大家帶來一堂NOSQL的課程,本期的主角是Redis。希望大家學完本次分享課程後對redis有一個基本的瞭解和認識,並且熟悉和掌握 Redis在.NET中的使用。本次分享課程包含以下知識點: 1、StackExchange.Redis (簡稱:SE)驅動在C#中Redis幾種 ...
  • 一、前言 前文 "Nginx 解決WebApi跨域二次請求以及Vue單頁面問題" 當中雖然解決了跨域問題帶來的二次請求,但也產生了一個新的問題,就是如果需要獲取用戶IP的時候,獲取的IP地址總是本機地址。 二、原因 由於 反向代理後,在應用中取得的 都是反向代理伺服器的 ,取得的功能變數名稱也是反向代理配置 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...