V4 驱动程序 UI 体系结构

重要

建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) ,自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

有关详细信息,请参阅 打印支持应用设计指南

v4 驱动程序体系结构的高级设计目标是为 Microsoft Store 应用用户界面提供内置支持。

采用的基于应用程序的 UI 范例就是一个明显的例子。 UWP 设备应用为用户提供 Microsoft Store 应用 UI 中支持的全屏体验。 用于打印的 UWP 设备应用为打印首选项提供扩展性,并为支持 v4 打印驱动程序的打印机提供打印机通知。 用于打印的 UWP 设备应用还在新的“开始”屏幕上提供打印设备的可见性。

当用户在 Windows 桌面上运行现有应用程序时,打印机扩展应用支持打印首选项和打印机通知。 尽管这些应用程序的 UI 非常不同,其中一个 UI 专为触摸定制,另一个针对鼠标和键盘用户进行了优化,但无论 UI 如何,业务逻辑和与 v4 打印驱动程序的连接仍可能相似。

下图显示了 GitHub 上提供的 v4 打印驱动程序和打印机扩展示例 的 Microsoft Store 设备应用的高级体系结构。

自定义 ui 体系结构概述。

如上图所示,基于模型/视图/控制器的体系结构使应用能够在模型层共享用 C# 编写的代码。

扩展 PrinterExtensionLibrary

可以使用新类或通过扩展提供的类集来扩展各种示例中附带的 PrinterExtensionLibrary 项目。 由于 Microsoft 定期对示例代码进行更新,因此我们建议合作伙伴应尽量减少对提供的源文件所做的代码更改数。 对于扩展提供的类集的合作伙伴,建议将现有类标记为“部分”,并在单独的源文件中添加新函数或替代。

在 UWP 应用和桌面应用之间共享编译的二进制文件

Microsoft Store 设备应用和打印机扩展示例中提供的 PrinterExtensionLibrary 项目使用相同的源代码,但生成代码可能很有价值,以便在项目之间可移植,而无需为每个项目单独生成。 若要使 PrinterExtensionLibrary 项目的代码可移植,必须将项目转换为可移植类库。 执行以下步骤进行转换。

  1. 在 Microsoft Visual Studio 中,单击“ 文件>新建>项目”,然后在“ 搜索已安装的模板 ”框中搜索“可移植”。

  2. 选择“可移植类库 Visual C#”,然后在“名称”文本框中提供项目 的名称 ,然后单击“ 确定”。

  3. 将现有 PrinterExtensionLibrary 项目中的源代码复制到新项目中。

  4. 右键单击可移植类库项目,然后选择“ 卸载”。 然后打开 .csproj 文件,并在文档中最后一个标记之前将以下部分添加到文件中。

      <ItemGroup>
        <COMReference Include="PrinterExtensionLib">
          <Guid>{91CE54EE-C67C-4B46-A4FF-99416F27A8BF}</Guid>
          <VersionMajor>1</VersionMajor>
          <VersionMinor>0</VersionMinor>
          <Lcid>0</Lcid>
          <WrapperTool>tlbimp</WrapperTool>
          <Isolated>False</Isolated>
          <EmbedInteropTypes>True</EmbedInteropTypes>
        </COMReference>
      </ItemGroup>
    
  5. 如果看到 COM 引用导致的警告,请将以下内容添加到 <PropertyGroup> 标记:

<ResolveComReferenceSilent>true</ResolveComReferenceSilent>

用于打印 UI 方案的 API

API 已开发为 v4 打印驱动程序模型的一部分,以支持打印机扩展和 UWP 设备应用进行打印。 概括而言,打印首选项方案使用 PrintTicket、PrintCapabilities 和新的属性包来获取和存储其所有信息。 打印机通知由基于双向通信 (Bidi) 架构的新事件系统驱动,此新系统使用客户端和服务器之间的 AsyncUI 协议。 此 API 以数据为中心的性质意味着一个应用程序可以轻松支持许多设备。

需要以这样一种方式构建打印机扩展,以便在请求的数据不可用时可以正常降级。 例如,如果特定 PrintCapabilities 功能不可用,或者其中一个属性包中的属性不可用,则不应阻止应用的其余部分正常运行。 访问属性包或属性包中的特定属性时,应用应使用 try-catch 语法,以确保引发的任何异常不会导致应用崩溃。 有关详细信息,请参阅 打印机扩展接口

打印机扩展接口

v4 在 GitHub 上打印驱动程序示例