使用墨迹分析的数据代理

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

数据代理的类型

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

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

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

同步更新

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

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

  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