V4 驱动程序 UI 体系结构
重要
新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。
有关详细信息,请参阅新式打印平台和打印支持应用设计指南。
v4 驱动程序体系结构的一个高级设计目标是为 Microsoft Store 应用用户界面提供内置支持。
所采用的基于应用程序的 UI 范例就是一个明显的例子。 UWP 设备应用为用户提供全屏体验,而 Microsoft Store 应用 UI 支持这种体验。 用于打印的 UWP 设备应用为打印首选项提供了可扩展性,并为支持 v4 打印驱动程序的打印机提供了打印机通知。 用于打印的 UWP 设备应用还能在新的“开始”屏幕上显示打印设备。
用户在 Windows 桌面上运行现有应用程序时,打印机扩展应用支持打印首选项和打印机通知。 虽然这些应用程序的 UI 大相径庭,一个是为触摸屏量身定制的,另一个是为鼠标和键盘用户优化的,但无论 UI 如何,业务逻辑和与 v4 打印驱动程序的连接仍然是相似的。
下图显示了Microsoft应用商店设备应用的高级别体系结构。
如上图所示,基于模型/视图/控制器的体系结构使应用能够共享以 C# 编写的模型层代码。
扩展 PrinterExtensionLibrary
各种示例中包含的 PrinterExtensionLibrary 项目可以使用新的类进行扩展,也可以通过扩展所提供的类集进行扩展。 由于 Microsoft 会定期对示例代码进行更新,因此建议合作伙伴应尽量减少对所提供源文件的代码更改次数。 对于扩展所提供类集的合作伙伴,建议将现有类标记为“部分”,并在单独的源文件中添加新函数或覆盖。
在 UWP 应用和桌面应用之间共享编译后的二进制文件
在 Microsoft Store 设备应用和打印机扩展示例中提供的 PrinterExtensionLibrary 项目都使用相同的源代码,但如果能生成代码,使其无需为每个项目单独生成即可在项目间移植,则可能会很有价值。 要使 PrinterExtensionLibrary 项目的代码具有可移植性,则必须将该项目转换为可移植类库。 执行以下步骤进行转换。
在 Microsoft Visual Studio 中,单击文件>新建>项目,然后在“搜索安装的模板”框中搜索“可移植”。
选择可移植类库 Visual C#,然后在“名称”文本框中提供项目名称,接下来单击“确定”。
将现有 PrinterExtensionLibrary 项目中的源代码复制到新项目中。
右键单击可移植类库项目,选择“卸载”。 然后打开 .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>
如果因引用 COM 而出现警告,请在 <PropertyGroup> 标记中添加以下内容:
<ResolveComReferenceSilent>true</ResolveComReferenceSilent>
用于打印 UI 方案的 API
作为 v4 打印驱动程序模型的一部分,我们开发了一个 API,以支持打印机扩展和 UWP 设备应用的打印。 概括而言,打印首选项方案使用 PrintTicket、PrintCapabilities 和新的属性包来获取和存储其所有信息。 打印机通知由基于双向通信 (Bidi) 架构的新事件系统驱动,这个新系统在客户端和服务器之间使用 AsyncUI 协议。 该 API 以数据为中心,这意味着一个应用程序可以轻松支持多种设备。
打印机扩展需要以这样一种方式来生成,即如果所请求的数据不可用,它们可以正常地降级。 例如,如果某个特定的 PrintCapabilities 功能不可用,或者某个属性包中的某个属性不可用,都不会妨碍应用其他部分的运行。 在访问属性包或属性包中的特定属性时,应用应使用 try-catch 语法,以确保引发的任何异常都不会导致应用崩溃。 有关详细信息,请参阅打印机扩展接口。