乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - 探索WinUI 2.x系列

背景

Windows 11带来了全新设计的开始菜单、任务栏、设置、资源管理器、搜索、侧边工具栏、微软商店,并且自内测以来,微软对内置的应用陆续进行了更新,包括画图、记事本、计算器、闹钟和时钟、照片、截图和草图、电影和电视。

image

他们都有一个共同的特征,披上了Windows 11新流畅设计外衣,大幅提高了Windows应用的审美高度。

image

通过App Packager Viewer这个小工具,我们可以清晰地查看到他们的背后都依赖了一个包为Microsoft.UI.Xaml.2.x

WinUI,是Windows GUI解决方案进化的产物

它并非腾空而出,而是脱胎于微软打磨了6年之久的Windows通用应用平台,常简称为UWP

UWP是伴随Windows 10操作系统发布的面向Windows终端设备的通用应用开发解决方案,新的通用平台允许新类型的Windows10通用应用真正实现一次编写、一套业务逻辑和统一的用户界面。
应用在统一的Win10商店中将只会有一个安装包,而它将适用于所有Win10设备。

image

Windows 10 v1809开始,微软将UWP技术的UX框架剥离出来将原有的“UWP + Windows SDK”的组合,进化成“Windows SDK + Windows App SDK + WinUI”的组合。

WinUI现在是桌面应用和通用应用共同的UX框架,通过将流畅设计系统整合到所有体验、控件和样式中,使用最新的用户界面模式提供一致、直观且可访问的体验。

image

发行

https://docs.microsoft.com/zh-cn/windows/apps/winui/winui2/release-notes/

image

WinUI包括两个NuGet包:

实践

https://github.com/TaylorShi/HelloWinUI2.x

https://docs.microsoft.com/zh-cn/windows/apps/winui/winui2/getting-started

创建解决方案HelloWinUI2

dotnet new sln -o HelloWinUI2
cd .\HelloWinUI2\

image

创建UWP项目demoForWinUI2

explorer.exe .

image

image

选择C#语言-Windows平台-UWP类型,选中空白应用(通用Windows)模板,创建名为demoForWinUI2的项目。

image

image

如果你打算使用Microsoft.UI.Xaml v2.7包,那么最低版本要求 >= 10.0.15063.0,目标版本要求 >= 10.0.18362.0

所以这里我们最低版本选15063,目标版本就选看到的最高版本19041了。

image

创建成功

image

运行一次

image

安装WinUI的Nuget包

https://www.nuget.org/packages/Microsoft.UI.Xaml

截止到写作时,最新稳定版是v2.7,预览版到了v2.8了

image

dotnet add package Microsoft.UI.Xaml

这种DotNet-CLI的方式暂时对UWP还不支持哈,放弃。

image

Install-Package Microsoft.UI.Xaml

或者在demoForWinUI2项目上右键,选择"管理Nuget程序包",直接搜索Microsoft.UI.Xaml进行安装吧。

image

安装完毕之后,我们会看到多了一个包Microsoft.UI.Xaml,还有个叫Microsoft.UI.Xaml.Markupwinmd组件依赖,它位于"Windows SDK 10.0.19041.0"里面。

image

根据使用指引,我们还需要把WinUI的主题资源加到UWP项目里面来,我们打开App.xaml,把Microsoft.UI.Xaml.Controls的Xaml控件资源加载进来。

<Application
    x:Class="demoForWinUI2.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:demoForWinUI2">

    <Application.Resources>
        <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
    </Application.Resources>

</Application>

如果你已经有其他资源了,应该使用MergedDictionaries来添加,举例为:

<Application
    x:Class="ExampleApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    RequestedTheme="Light">

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
                <ResourceDictionary Source="/Styles/Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>

通过我们需要把Microsoft.UI.Xaml.Controls的Xaml控件资源放在多组自定义样式资源的最前面,因为Xaml的加载机制会按顺序覆盖同Key的资源的,这样可以避免其他自定义资源被覆盖掉。

.xaml.cs文件中,如果需要使用到Microsoft.UI.Xaml的资源,需要引入Using项:

using MUXC = Microsoft.UI.Xaml.Controls;

.xaml文件中,如果需要使用到Microsoft.UI.Xaml的资源,需要引入Xml项:

xmlns:muxc="using:Microsoft.UI.Xaml.Controls"

使用WinUI样式Mica

https://docs.microsoft.com/zh-cn/windows/apps/design/style/mica

image

在Windows 11上新增了一种云母(Mica) 材质,它通过提取用户桌面背景的颜色来获取颜色,适合作为应用背景来增加沉浸感。

image

在UWP里面,基于Microsoft.UI.Xaml包启用云母(Mica) 材质非常简单,它实际上是一直存在的底层背景,我们只需要告诉应用,让它呈现出来即可。

打开MainPage.xaml,在Page在根节点指定BackdropMaterial.ApplyToRootOrPageBackground属性为True

<Page
    x:Class="demoForWinUI2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:demoForWinUI2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    muxc:BackdropMaterial.ApplyToRootOrPageBackground="True"
    >

    <Grid>

    </Grid>
</Page>

运行看看效果,哈,果然是想要的效果。

image

参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章