具有墨迹分析的数据代理

墨迹分析概述中所述,墨迹分析技术在内部维护基于树的文档模型,以包含分析结果和关系。 如果应用程序已有不同的已建立的文档存储,则需要使用设计为在不同文档模型之间代理数据的墨迹分析功能。

数据代理的类型

数据代理功能使应用程序能够:

  • 将分析结果数据重新集成到现有文档模型中。
  • 将以前的结果 (或状态) 传回 InkAnalyzer
  • 将非墨迹状态传达到 InkAnalyzer 中。
  • 仅传达完成分析操作所需的最小数据集 (以前的和非墨迹状态) 。
  • 使用分析结果轻松更新内部应用程序文档模型。

墨迹分析数据代理有两种基本方法。 差异在于文档模型之间的同步发生时间和方式的详细信息。 第一种方法同步更新要求在应用程序文档中发生更改时修改墨迹分析文档模型。 第二种方法(按需更新)仅要求将受应用程序文档模型更改影响的数据传递到 InkAnalyzer。 也就是说,只有墨迹分析文档模型部分的数据与对应用程序文档的修改位于同一区域中,才需要传递到 InkAnalyzer ,因为它需要这些数据。

同步更新

同步更新方法需要修改 (创建和删除 InkAnalyzer 对象的 ContextNode 对象集合中的节点) ,因为它们发生在应用程序文档中。 例如,每次向应用程序添加文本单词时,都会在 InkAnalyzer 中创建相应的 TextWord 样式 ContextNode。 如果文本单词在页面上的位置发生更改,则会同时更新相应 ContextNode 的位置。 与按需方法相比,此方法在计算资源方面效率较低,因为每次文档更改都涉及 对 InkAnalyzer 的更新,即使更改不会影响正在分析的墨迹。

以下示例旨在显示同步更新的工作原理。 假设一个具有现有文档模型的应用程序。 当最终用户对文档进行更改(例如添加新文本)时,将按如下所示处理更改:

  1. 最终用户创建新数据。
  2. 应用程序确定如何处理数据、存储数据以及呈现数据。
  3. 出于实际目的,将同时执行以下步骤。
    1. 应用程序将数据放入其文档模型中。
    2. 应用程序创建 InkAnalyzer 并更新它。 同时执行此操作可确保 InkAnalyzer 始终具有最新信息。
    3. 应用程序在 InkAnalyzer 上调用 BackgroundAnalyze 以开始分析。
  4. 如果更改涉及墨迹,并且 InkAnalyzer 确定新结果,则会触发一系列事件。 对 InkAnalyzer 中的 ContextNode 对象集合所做的每次更改都会触发一个事件。 这些事件包括 ContextNodeCreatedContextNodeDeletingContextNodeMovingToPositionContextNodePropertiesUpdatedContextNodeLinkAddingContextNodeLinkDeletingContextNodeReparenting。 应用程序处理这些事件,以根据需要将分析操作的结果代理回文档模型。
  5. 应用程序更新文档的布局,从文档模型拉取新数据。
  6. 新数据将呈现回最终用户。

按需更新

按需方法仅要求为要分析的区域中的 ContextNode 对象传递数据。 所需的 ContextNode 对象是在调用分析操作后从应用程序的文档模型中提取的,也是在协调结果之前再次提取的。 虽然实现比同步更新更复杂,但此方法会产生更好的性能结果。

墨迹分析概述

InkAnalyzer 类 (C++)

Microsoft.Ink.InkAnalyzer

Microsoft.Ink.ContextNode