数据代理事件流

本主题讨论使用墨迹分析数据代理功能时发生的事件的详细信息。

数据代理事件流概述

在 InkAnalyzer 的数据代理用法中,假定集成 InkAnalyzer 的应用程序已有一个现有文档模型,他们希望将分析结果代理到其中。 此外,还假定应用程序将具有之前任何希望基于存储在文档模型中的分析作的结果。 也可能存在可能以 ImageNodeTextWordNode ContextNode 的形式添加到 InkAnalyzer 的非墨迹上下文,以可能用墨迹进行批注。

数据代理系统的密钥是让应用程序使用 PartiallyPopulatedContextNode 标记为“部分填充”。 当此标志为 true 时, InkAnalyzer 假定该 ContextNode 有三项内容:

根据这三个规则,如果 InkAnalyzer 需要有关 ContextNode 的其他信息,它将引发 PopulateContextNode 事件并引用相关 ContextNode 。 这使应用程序有机会在 InkAnalyzer 更详细地查看上下文节点之前设置有关该 ContextNode 的所有已知信息。 处理 PopulateContextNode 事件后,相关 ContextNode 必须具有有效的位置属性,如果子节点是容器 ContextNode ,或者使用 SetStrokes 设置正确的笔划,则为墨迹叶 ContextNode。 未能正确设置此位置以及子节点或笔划信息将导致 InvalidOperation 异常。 容器 ContextNode 的子节点本身可以设置为部分填充,在这种情况下,如果 InkAnalyzer 确定当前分析作需要它们,则会引发更多 PopulateContextNode 事件。

下表描述了在 InkAnalyzer 的整个用法中何时引发 PopulateContextNode 事件。

在 InkAnalyzer 计算出一些结果后,它将回顾应用程序以更新结果。 引发的第一个事件是 InkAnalyzerStateChanging 事件。 此事件仅表示 InkAnalyzer 对象的树状态即将更改的应用程序。 这样,应用程序就有机会在存储在其他位置的任何 ContextNodes 上将 PartiallyPopulated 标志设置为 true。 然后 ,InkAnalyzer 将引发一系列 PopulateContextNode 事件,以确定数据的当前状态。 确定对帐作完成后,确定仍可应用哪些后台结果。

若要将结果应用于 InkAnalyzer ,将引发一系列树修改事件。 树修改事件分步描述更新结果所需的所有更改。 这些事件旨在连续处理,而无需干预或取消。 如果在处理树修改事件期间(通过 中止 方法)取消分析作, InkAnalyzer 的状态将无效,并且可能需要重新分析整个文档。

下表描述了在 InkAnalyzer 的整个使用过程中引发树修改事件的情况。 这些表引用了以下事件流图所示的时间戳。

iimage 显示应用程序 UI 和后台分析器之间的流

添加笔划

时间戳 事件类型或用途 引发的事件 注释
T1、T5 和 T9
[在调用 AddStroke()][树探索事件]
PopulateContextNode 事件引发
可能会引发一些 PopulateContextNode 事件,具体取决于存在多少个 未分类的 ContextNode, 其中 部分填充 的值设置为 true。
T1、T5 和 T9
[树修改事件]
引发 ContextNodeCreated 事件
由于调用 AddStroke 方法,只会引发一个 ContextNodeCreated 事件。 所有笔划都添加相同的未分类 ContextNode

删除笔划

时间戳 事件类型或用途 引发的事件 注释
T2、T6 和 T10
[在调用 RemoveStroke()][树探索事件]
PopulateContextNode 引发的事件
可能会引发许多 PopulateContextNode 事件,具体取决于与要删除的笔划相关的 ContextNode 的数量,其值为 PartiallyPopulated 值。
T2、T6 和 T10
[树修改事件]
ContextNodeDeleting 引发的事件
可能会引发任意数量的 ContextNodeDeleting 事件,具体取决于要删除的墨迹内容和当前的 Analysis 结构。

调用 BackgroundAnalyze 方法

时间戳 事件类型或用途 引发的事件 注释
T3
[在 调用 BackgroundAnalyze()][树探索事件]
PopulateContextNode 引发的事件
可能会引发 n 个 PopulateContextNode 事件,具体取决于树中有多少 ContextNode 具有 部分填充 值 true(当前分析作中所需的每个 ContextNode 一个事件)。

调用 BackgroundAnalyze() 返回后

时间戳 事件类型或用途 引发的事件 注释
T3 到 T7
[从 BG 线程引发的事件]
引发的活动事件
在此分析后台期间将引发多个活动事件。

当 IntermediateResults 准备就绪时

时间戳 事件类型或用途 引发的事件 注释
T7 到 T8
[从 BG 线程引发的事件,表示第一次协调作的开始]
InkAnalyzerStateChanging 引发的事件
仅引发一个 InkAnalyzerStateChanging 事件。 此事件是在检查 InkAnalyzer 的状态之前引发的,使应用程序有机会在任何节点上设置 PartiallyPopulated 值或执行所需的任何本地文档锁定。
T7 到 T8
[树探索事件]
PopulateContextNode 引发的事件
根据墨迹内容,可能会引发 n 个 PopulateContextNode 事件。
T7 到 T8
[树修改事件]
ContextNodeCreated 引发的事件
根据墨迹内容,可能会引发 n 个 ContextNodeCreated 事件。
T7 到 T8
[树修改事件]
ContextNodeDeleting 引发的事件
根据墨迹内容,可能会引发 n 个 ContextNodeDeleting 事件。
T7 到 T8
[树修改事件]
ContextNodeMovingToPosition
根据墨迹内容,可能引发的 ContextNodeMovingToPosition 事件数可能为 n 个。
T7 到 T8
[树修改事件]
ContextNodeReparenting
根据墨迹内容,可能会引发 n 个 ContextNodeReparenting 事件。
T7 到 T8
[树修改事件]
StrokeReparented
根据墨迹内容,可能会引发 n 个 StrokeReparented 事件。
T7 到 T8
[树修改事件]
ContextNodeLinkAdding
根据墨迹内容,可能会引发 n 个 ContextNodeLinkAdding 事件。
T7 到 T8
[树修改事件]
ContextNodeLinkDeleting
根据墨迹内容,可能引发的 ContextNodeLinkDeleting 事件数可能为 n 个。
T7 到 T8
[树修改事件]
ContextNodePropertiesUpdated 引发的事件
根据墨迹内容,可能会引发 n 个 ContextNodePropertiesUpdated 事件。 在此协调期间引发所有其他 ContextNode 修改事件后,将计划引发 ContextNodePropertiesUpdated
T7 到 T8
[事件表示第一次协调作的结束]
IntermediateResults 引发的事件
每个分析作只引发一个 IntermediateResults 事件。

处理 IntermediateResults 后

时间戳 事件类型或用途 引发的事件 注释
T8 到 T11
[从 BG 线程引发的事件]
活动 引发的事件
在此分析后台期间将引发多个 活动 事件。

当最终结果准备就绪时

时间戳 事件类型或用途 引发的事件 注释
T11 到 T12
[从 BG 线程引发的事件,表示第二次协调作的开始]
InkAnalyzerStateChanging 引发的事件
仅引发一个 InkAnalyzerStateChanging 事件。 此事件是在检查 InkAnalyzer 的状态之前引发的,使应用程序有机会在任何节点上设置 PartiallyPopulated 值或执行所需的任何本地文档锁定。
T11 到 T12
[树探索事件]
PopulateContextNode 引发的事件
根据墨迹内容,可能会引发任意数量的 PopulateContextNode 事件。
T11 到 T12
[树修改事件]
ContextNodeCreated 引发的事件
根据墨迹内容,可能会引发任意数量的 ContextNodeCreated 事件。
T11 到 T12
[树修改事件]
ContextNodeDeleting 引发的事件
可能会引发任意数量的 ContextNodeDeleting 事件,具体取决于墨迹内容。
T11 到 T12
[树修改事件]
ContextNodeMovingToPosition
可能会引发任意数量的 ContextNodeMovingToPosition 事件,具体取决于墨迹内容。
T11 到 T12
[树修改事件]
ContextNodeReparenting
可能会引发任意数量的 ContextNodeReparenting 事件,具体取决于墨迹内容。
T11 到 T12
[树修改事件]
StrokeReparented
可能会引发任意数量的 StrokeReparented 事件,具体取决于墨迹内容。
T11 到 T12
[树修改事件]
ContextNodeLinkAdding
可能会引发任意数量的 ContextNodeLinkAdding 事件,具体取决于墨迹内容。
T11 到 T12
[树修改事件]
ContextNodeLinkDeleting
根据墨迹内容,可能会引发任意数量的 ContextNodeLinkDeleting 事件。
T11 到 T12
[树修改事件]
ContextNodePropertiesUpdated 引发的事件
根据墨迹内容,可能会引发任意数量的 ContextNodePropertiesUpdated 事件。 在此协调期间引发所有其他 ContextNode 修改事件后,将安排 ContextNodePropertiesUpdated
T11 到 T12
[事件表示第二次协调作结束]
结果 引发的事件
每个分析作只引发一个 Results 事件。