数据代理事件流

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

数据代理事件流概述

InkAnalyzer 的数据代理使用中,假定集成 InkAnalyzer 的应用程序已有一个现有文档模型,他们希望将分析结果代理到该模型。 还假定应用程序将具有他们希望在其文档模型中存储的任何先前分析操作的结果。 可能还会有非墨迹上下文,这些上下文可能以 ImageNodeTextWordNodeContextNode 的形式添加到 InkAnalyzer,以使用墨迹进行批注。

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

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

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

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

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

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

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

添加笔划

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

删除笔划

时间戳 事件类型或用途 已引发事件 评论
T2、T6 和 T10
[在对 RemoveStroke () 的调用中][树探索事件]
PopulateContextNode 引发的事件
根据与要删除的笔划相关的 ContextNode 的数量,可能会引发大量 PopulateContextNode 事件,其部分填充值为 true。
T2、T6 和 T10
[树修改事件]
ContextNodeDeleting 引发的事件
可能会引发任意数量的 ContextNodeDeleting 事件,具体取决于要删除的墨迹内容和当前的 Analysis 结构。

调用 BackgroundAnalyze 方法

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

调用 BackgroundAnalyze () 后返回

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

当 IntermediateResults 准备就绪时

时间戳 事件类型或用途 已引发事件 评论
T7 到 T8
[从 BG 线程引发的事件,表示第一个协调操作的开始]
InkAnalyzerStateChanging 引发的事件
仅引发一个 InkAnalyzerStateChanging 事件。 此事件在检查 InkAnalyzer 的状态之前引发,使应用程序有机会在任何节点上设置 PartiallyPopulated 值或执行所需的任何本地文档锁定。
T7 到 T8
[树探索事件]
PopulateContextNode 引发的事件
可能会引发 n 个 PopulateContextNode 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
ContextNodeCreated 引发的事件
可能会引发 n 个 上下文NodeCreated 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
ContextNodeDeleting 引发的事件
可能会引发 n 个 上下文NodeDeleting 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
ContextNodeMovingToPosition
可能会引发 n 个 ContextNodeMovingToPosition 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
ContextNodeReparenting
可能会引发 n 个 ContextNodeReparenting 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
StrokeReparented
可能会引发 N 个 StrokeReparented 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
ContextNodeLinkAdding
可能会引发 n 个 ContextNodeLinkAdding 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
ContextNodeLinkDeleting
可能会引发 n 个 上下文NodeLinkDeleting 事件,具体取决于墨迹内容。
T7 到 T8
[树修改事件]
ContextNodePropertiesUpdated 引发的事件
可能会引发 n 个 上下文NodePropertiesUpdated 事件,具体取决于墨迹内容。 在此协调期间引发所有其他 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 事件。