在 WPF 应用中使用 Windows App SDK
Windows App SDK 是 Windows 应用开发平台的下一个演变。 但本主题演示如何在 Windows Presentation Foundation (WPF) 应用中使用 Windows App SDK API(和 Windows Runtime API)!
- 在许多情况下,需要以 WinUI 3 应用的形式重新创建 WPF 应用。 迁移到 WinUI 3 的优势之一是有权访问 Fluent Design System(另请参阅设计 Windows 应用并编写代码)。 WinUI 3 是 Windows App SDK 的一部分,因此,WinUI 3 应用也可以使用其他Windows App SDK 功能和 API。 本主题不介绍将 WPF 应用迁移到 WinUI 3 的过程。
- 但是,如果发现使用的是 WinUI 3 中尚不可用的 WPF 功能,则仍然可以在 WPF 应用中使用 Windows App SDK 功能(如 App Lifecycle、MRT Core、DWriteCore 等)。 本主题演示如何执行该操作。
如果目前还没有 WPF 项目(或者想要练习该过程),本主题包含创建 WPF 项目的步骤,以便按照步骤操作并进行配置以调用 Windows App SDK API。
先决条件
- 安装适用于 Windows App SDK 的工具。
- 本主题介绍未打包和打包的 WPF 应用。 如果 WPF 应用已解压缩(默认使用哪个 WPF 应用),请确保已安装未打包应用的所有依赖项(请参阅 Windows App SDK 部署指南,了解使用外部位置打包或未打包的依赖框架的应用)。 执行此操作的快速方法是访问Windows App SDK 的最新下载,然后下载并解压缩,然后运行其中一个稳定版本 Runtime 下载。
重要
安装的 Runtime 版本需要与将在后续步骤中安装的 Microsoft.WindowsAppSDK NuGet 包的版本相匹配。
有关未打包和打包术语的详细信息,请参阅打包应用的优点和缺点。
如果还没有 WPF 项目,则创建一个
如果已有 WPF 项目,则可以转到下一部分。
- 在 Visual Studio 中,创建一个新的 C# WPF 应用程序项目(即 .NET 项目)。 请谨慎选择项目模板,确切名称为 WPF 应用程序,而不是 WPF 应用 (.NET Framework)。
- 为项目指定一个名称,并接受任何默认选项。
现在你有一个项目,用于生成未打包的 WPF 应用。
配置 WPF 项目以提供 Windows App SDK 支持
首先,我们将编辑项目文件。
在“解决方案资源管理器”中,右击项目,然后选择“编辑项目文件”。
此步骤可调用 Windows Runtime (WinRT) API(包括 Windows App SDK API)。 PropertyGroup 元素中的 TargetFramework 元素设置为 net6.0 等值。 向目标框架值追加名字对象(具体指目标框架名字对象)。 例如,如果应用目标是 Windows 10 版本 2004,请使用以下项:
<TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
此外,在 PropertyGroup 元素中添加 RuntimeIdentifiers 元素,如下所示。 如果目标是 .NET 8 或更高版本,则改用值
win-x86;win-x64;win-arm64
。<RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
默认情况下,WPF 应用已解压缩(这意味着未使用 MSIX 进行安装)。 未打包的应用在使用 Windows App SDK 的任何其他功能之前,必须先初始化 Windows App SDK 运行时功能。 当应用通过自动初始化启动时,可以自动执行此操作。 只需适当地设置 PropertyGroup 元素中的
WindowsPackageType
项目属性,如下所示:<WindowsPackageType>None</WindowsPackageType>
如果有高级需求(例如自定义错误处理或加载特定版本的 Windows App SDK),则无需自动初始化即可显式调用引导程序 API。有关详细信息,请参阅为使用外部位置打包或未打包的应用使用 Windows App SDK 运行时功能。
保存并关闭项目文件。
接下来,我们将在项目中安装 Windows App SDK NuGet 包。
- 在“解决方案资源管理器”中,右键单击项目的“依赖项”节点,然后选择“管理 Nuget 包...”。
- 在 NuGet 程序包管理器 窗口中,选择“浏览”选项卡,并安装最新的稳定Microsoft.WindowsAppSDK 包。
在 WPF 应用中使用一些 Windows App SDK 功能
本部分提供一个非常简单的示例来介绍如何从 WPF 应用调用 Windows App SDK API。 它使用 MRT Core 功能(请参阅使用 MRT Core 管理资源)。 如果本示例适用于 WPF 项目(即为此演练创建了一个新项目),则可以按照以下步骤操作。
将以下标记添加到 (可以将它粘贴到
MainWindow.xaml
根 网格中):<StackPanel> <Button HorizontalAlignment="Center" Click="Button_Click">Click me!</Button> <TextBlock HorizontalAlignment="Center" x:Name="myTextBlock">Hello, World!</TextBlock> </StackPanel>
现在,我们将添加一些代码来使用 Windows App SDK 中的 ResourceManager 类加载字符串资源。
将新的资源文件 (.resw) 项添加到项目(保留 Resources.resw 的默认名称)。
在编辑器中打开资源文件后,使用以下属性创建新的字符串资源。
- 名称:消息
- 值:Hello, resources!
保存并关闭资源文件。
在
MainWindow.xaml.cs
中,添加以下事件处理程序:
private void Button_Click(object sender, RoutedEventArgs e) { // Construct a resource manager using the resource index generated during build. var manager = new Microsoft.Windows.ApplicationModel.Resources.ResourceManager(); // Look up a string in the resources file using the string's name. myTextBlock.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString; }
生成项目并运行应用。 单击该按钮可查看显示的字符串
Hello, resources!
。
提示
如果在运行时看到一个消息框,指示应用程序需要特定版本的 Windows App Runtime 并询问是否要立即安装,则单击“是”。 这将带你进入 Windows App SDK 最新下载。 有关详细信息,请参阅上面的先决条件部分。
另请参阅运行时体系结构,详细了解应用在使用 Windows App SDK 时采用的 Framework 包依赖项,以及需要在未打包的应用中使用的其他组件。
使用 MSIX 打包并部署 WPF 应用
某些 Windows 功能和 API(包括 Windows App SDK 通知 API)要求应用在运行时具有包标识(换句话说,应用需要打包)。 有关详细信息,请参阅需要包标识的功能。
- 在 Visual Studio 的“解决方案资源管理器”中,右键单击解决方案,然后选择“添加”>“新项目...”。
- 在“添加新项目”对话框中,搜索 packaging,选择 C#“Windows 应用程序打包项目”项目模板,然后单击“下一步”。
- 命名项目,然后单击“创建”。
- 我们希望指定要将解决方案中的哪些应用程序包含在包中。 因此,在打包项目(不是 WPF 项目)中,右键单击“依赖项”节点,然后选择“添加项目引用...”。
- 在解决方案中的项目列表中,选择 WPF 项目,然后单击“确定”。
- 展开打包项目的依赖项>应用程序节点,确认已引用 WPF 项目并用粗体突出显示。 这意味着它将用作包的起点。
- 右键单击打包项目,然后选择“设为启动项目”。
- 右键单击 WPF 项目,然后选择“编辑项目文件”。
- 删除
<WindowsPackageType>None</WindowsPackageType>
、保存并关闭。 - 在“解决方案平台”下拉列表中,选择 x64(而不是任何 CPU)。
- 确认可以生成并运行。
打包 WPF 应用后,可以调用需要包标识的 API。 在 MainWindow.xaml.cs
中,编辑事件处理程序,使其如下所示:
private void Button_Click(object sender, RoutedEventArgs e)
{
var notification = new AppNotificationBuilder()
.AddArgument("action", "viewConversation")
.AddArgument("conversationId", "9813")
.AddText("Andrew sent you a picture")
.AddText("Check this out, The Enchantments in Washington!")
.BuildNotification();
AppNotificationManager.Default.Show(notification);
}
生成并重新运行。 单击该按钮,确认显示 Toast 通知。 从运行时缺少包标识的进程调用时,通知 API 将引发异常。
注意
本部分中的步骤演示了如何创建打包的应用。 另一种方法是使用外部位置创建打包的应用。 有关所有这些关键词的提醒,请参阅打包应用的优点和缺点。