zoukankan      html  css  js  c++  java
  • WinUI 3学习笔记(1)—— First Desktop App

    随着Visual Studio 2019 16.10版本的正式发布,创建WinUI 3的APP对我们来说,已不存在任何的难度。本篇我们就试着来一探究竟,看看WinUI 3 APP到底是个啥玩意,能不能重振Windows桌面开发。
    首先让我们把Visual Studio更新到16.10版本,16.10版本不仅全面支持热重载、实时可视化树和实时属性资源管理器。同时也不再需要修改Project文件,以修正 .NET SDK 和 winrt.runtime.dll 的版本不匹配的问题。

    在Visual Studio 2019,让我们找到Blank App, Packaged (WinUI 3 in Desktop)项目模板。如果发现没有该模板,则需要去以下地址下载安装。
    Project Reunion - Visual Studio Marketplace
    或者通过Visual Studio的Manage Extensions进行安装。

    这里选择Packaged的Desktop项目,某软声明该类型的工程已可以用于生产环境。而For UWP的版本仍是preview阶段,至于非Packaged的Desktop项目,还要等到年底才能得到支持。需要注意的是,WinUI3 当前最低支持的Win10版本是1809,然后目标版本是2004。如果小伙伴们发现没有2004即Build19041的SDK可以选,证明你的Windows10需要升级了。

    点击OK后,我们将成功创建第一个WinUI3的APP。打开解决方案管理器的话,默认的代码的结构如下图。整个解决方案下共有2个工程,作为主体的FirstWinUI3App,以及打包进商店用的FirstWinUI3App(Package)工程。看上去和之前DesktopBridge的打包方式极为相似,但是如果我们去检查Packages的话,会发现WinUI3引用的libraries都已经归属于ProjectReunion项目了。

    检查FirstWinUI3App工程,app.manifest作为Windows APP的传统配置文件,支持的OS版本,要不要管理员权限启动,都在这里定义,我们先不去管他。

    App.xaml和MainWindow的组合,就是标准的WPF和UWP的开局。其中App.xaml会提供一个ResourceDictionary,来放置Application级别的资源。

    <Application
        x:Class="FirstWinUI3App.App"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:FirstWinUI3App">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
                    <!-- Other merged dictionaries here -->
                </ResourceDictionary.MergedDictionaries>
                <!-- Other app resources here -->
            </ResourceDictionary>
        </Application.Resources>
    </Application>

    而在App.xaml.cs中,因为该Desktop工程没有UWP中的Suspend和Resume等概念,就只overrid了OnLaunched方法,提供了一个类级别的Window对象。从这点来看Dekstop版本的WinUI 3工程,更像WPF。
    MainWindow是一个标准的XAML Window对象,在App.xaml.cs的OnLaunched方法中实例化,然后Activate。

            protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
            {
                m_window = new MainWindow();
                m_window.Activate();
            }
    
            private Window m_window;

    当然我们也可以抛开Window对象,像UWP一样通过Page开局。

            protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
            {
                m_window = new Window();
    
                var rootFrame = new Frame();
                m_window.Content = rootFrame;
                rootFrame.Navigate(typeof(BlankPage1));
    
                m_window.Activate()
            }
    
            private Window m_window;

    如果我们打开MainWindow.xaml文件,会发现命名空间依然和十年前如出一辙,可以认为XAML这套东西仍会在将来的很长一段时间内存在。我们切换到MainWindow.xaml.cs中,情况和WPF或UWP就稍有不同。命名空间由WPF的Syste.Windows和UWP的Windows.UI.Xaml被统一为了Microsoft.UI.Xaml。这应该就是WinUI 3的使命,即统一今后Windows 桌面开发的UI。同时我也注意到,除了System这样的基础框架类库外(可以认为这部分与平台无关,隶属于.NET 5),Win UI3对Windows runtime API的使用,已经切换到了Windows.Foundation这一命名空间下,与UWP保持一致。
    如果忽略这些细节上的变动,那么可以认为WinUI 3的Desktop版,就是WPF+UWP混着写。至于流毒甚久的某软出一版框架,就要推倒重头学一次的说法,我个人表示完全是无稽之谈,至少从WPF,Sliverlight,UWP到WinUI 3都是平滑过渡。
    下面转到FristWinUI3App(Package)工程,这个打包工程是用于将exe打包成MSIX结构的安装文件,上传到微软商店用的。以后如果支持非Package版的Desktop开发,该工程则不是必须的。
    Dependencies下的Applications节点,包含被打包的FirstWinUI3App的引用,当然这个是自动添加的,不需要我们操心。Images节点下,包含了微软商店应用程序需要的各种尺寸的图标和图片。

    最后我们双击Package.appxmanifest文件,可以打开该文件对应的编辑器,用以声明APP的各种能力,设置图标,标注APP需要向用户申请的权限,以及打包的信息诸如发行商,APP名称等等。这一块的内容完全继承自UWP。

    对WinUI 3的第一次探索到此就告一段落。后面我们会在Github上fork Xaml-Controls-Gallery这个repo,并切换到WinUI3分支,来进一步学习WinUI 3是怎么将现代化的UI带给Windows Desktop APP的。
    本篇示例代码:

    WinUI3Samples/WinUI3Samples/FirstWinUI3App at main · manupstairs/WinUI3Samples (github.com)

    以下链接,是MS Learn上Windows开发的入门课程,单个课程三十分钟到60分钟不等,如需补充基础知识的同学点这里:

    开始使用 Visual Studio 开发 Windows 10 应用

    开发 Windows 10 应用程序

    编写首个 Windows 10 应用

    创建 Windows 10 应用的用户界面 (UI)

    增强 Windows 10 应用的用户界面

    在 Windows 10 应用中实现数据绑定

  • 相关阅读:
    InterLockedIncrement and InterLockedDecrement函数原理
    矩阵文件书写的简洁代码
    注册自定义URL协议(zhuan)
    求整数的位数
    WinExec unicode 处理
    C++中如何获取对象的名字(变量名,注意不是类名)
    计算所与北大往事回顾
    不尚贤在人事管理中的作用
    寻找适合自己的无资金创业之路
    诺基亚:用薪酬激励员工
  • 原文地址:https://www.cnblogs.com/manupstairs/p/14885758.html
Copyright © 2011-2022 走看看