本主题讨论使用墨迹分析数据代理功能时发生的事件的详细信息。
数据代理事件流概述
在 InkAnalyzer 的数据代理用法中,假定集成 InkAnalyzer 的应用程序已有一个现有文档模型,他们希望将分析结果代理到其中。 此外,还假定应用程序将具有之前任何希望基于存储在文档模型中的分析作的结果。 也可能存在可能以 ImageNode 或 TextWordNode ContextNode 的形式添加到 InkAnalyzer 的非墨迹上下文,以可能用墨迹进行批注。
数据代理系统的密钥是让应用程序使用 PartiallyPopulated 将 ContextNode 标记为“部分填充”。 当此标志为 true 时, InkAnalyzer 假定该 ContextNode 有三项内容:
- ContextNode 的位置正确。
- ContextNode 的类型正确。
- 有关 该 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 的整个使用过程中引发树修改事件的情况。 这些表引用了以下事件流图所示的时间戳。
添加笔划
时间戳 | 事件类型或用途 | 引发的事件 | 注释 |
---|---|---|---|
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 事件。 |