使用墨迹分析的数据代理

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

数据代理的类型

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

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

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

同步更新

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

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

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

按需更新

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

墨迹分析概述

InkAnalyzer 类 (C++)

Microsoft.Ink.InkAnalyzer

Microsoft.Ink.ContextNode