一个基础的 C++WinRT Windows UI 库 2 示例 (UWP)

本主题详述如何向 C++/WinRT UWP 项目添加对 Windows UI 库 (WinUI) 的基础支持。 具体来说,本主题涉及适合 WinUI 2,它适合 UWP 应用。 对于桌面应用,存在 WinUI 3。 顺便一提,WinUI 本身是用 C++/WinRT 编写的。

重要

对于桌面应用,Windows 应用 SDK 提供了 Windows UI 库 (WinUI) 3。 WinUI 3 不适用于本主题中的演练,而是适合 UWP。 另请参阅从 UWP 迁移到 Windows 应用 SDK

注意

Windows UI 库 (WinUI) 工具包以 NuGet 包的形式提供,可添加到任何现有或新的项目,只要该项目使用 Visual Studio 即可,这一点我们会在本主题中介绍。 如需更多的背景、设置和支持信息,请参阅 Windows UI 库入门

创建空白应用 (HelloWinUICppWinRT)

在 Visual Studio 中,使用“空白应用(C++/WinRT)”项目模板创建新的 UWP 项目。 请确保使用的是“(C++/WinRT)”模板,而不是“(通用 Windows)”模板。

将新项目的名称设置为 HelloWinUICppWinRT,(使文件夹结构与此演练匹配),然后取消选中“将解决方案和项目放在同一目录中”。

安装 Microsoft.UI.Xaml NuGet 包

单击“项目”>“管理 NuGet 包...”>“浏览”,在搜索框中键入或粘贴“Microsoft.UI.Xaml”,在搜索结果中选择该项,然后单击“安装”,将包安装到项目中(还会看到许可协议提示)。 注意,只能安装 Microsoft.UI.Xaml 包,不要安装 Microsoft.UI.Xaml.Core.Direct

声明 WinUI 应用程序资源

打开 App.xaml,将以下标记粘贴到现有的起始和结束 Application 标记之间。

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

将 WinUI 控件添加到 MainPage

接下来,打开 MainPage.xaml。 在现有的起始 Page 标记中,有一些 XML 命名空间声明。 添加 XML 命名空间声明 xmlns:muxc="using:Microsoft.UI.Xaml.Controls"。 然后,将以下标记粘贴到现有的起始和结束 Page 标记之间,覆盖现有的 StackPanel 元素。

<muxc:NavigationView PaneTitle="Welcome">
    <TextBlock Text="Hello, World!" VerticalAlignment="Center" HorizontalAlignment="Center" Style="{StaticResource TitleTextBlockStyle}"/>
</muxc:NavigationView>

根据需要编辑 pch.h

将 NuGet 包(例如此前添加的 Microsoft.UI.Xaml 包)添加到某个 C++/WinRT 项目并生成该项目时,此工具会在项目的 \Generated Files\winrt 文件夹中生成一组投影头文件。 如果已按照演练进行操作,则现在会有一个 \HelloWinUICppWinRT\HelloWinUICppWinRT\Generated Files\winrt 文件夹。 若要将这些头文件引入项目中,以便解析对这些新类型的引用,可以进入预编译的头文件(通常为 pch.h)中,将它们包括进去。

只需包含与使用的类型对应的标头。 但下面是一个示例,其中包含为 Microsoft.UI.Xaml 包所有生成的头文件。

// pch.h
...
#include "winrt/Microsoft.UI.Xaml.Automation.Peers.h"
#include "winrt/Microsoft.UI.Xaml.Controls.h"
#include "winrt/Microsoft.UI.Xaml.Controls.Primitives.h"
#include "winrt/Microsoft.UI.Xaml.Media.h"
#include "winrt/Microsoft.UI.Xaml.XamlTypeInfo.h"
...

编辑 MainPage.cpp

MainPage.cpp 中删除 MainPage::ClickHandler 实现中的代码,因为 myButton 不再存在于 XAML 标记中。

现在可以生成并运行该项目了。

简单的 C++/WinRT Windows UI 库的屏幕截图