数据代理事件Flow

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

数据代理事件Flow概述

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

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

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

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

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

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

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

iimage showing the flow between the application ui and the background analyzer

添加笔划

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

删除笔划

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

调用 BackgroundAnalyze 方法

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

调用 BackgroundAnalyze () 后返回

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

当 IntermediateResults 准备就绪时

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