事件路由
事件路由负责把浏览器输入转换为框架内的组件事件。它连接命中测试、焦点、手势和组件交互。
输入来源
常见输入来源包括:
- pointer down / move / up。
- wheel。
- keyboard。
- composition 输入。
- paste。
- context menu。
不同组件只处理自己关心的事件。
指针事件
指针事件通常先经过命中测试,再派发给命中的组件。可交互组件根据自身状态决定是否处理事件。
典型行为:
- Button 在 pointer down 时进入 pressed 状态。
- TreeView 根据点击位置选择、展开或勾选节点。
- DataGrid 根据单元格位置选择、编辑或拖拽列宽。
- ScrollViewer 根据 wheel 更新滚动位置。
键盘事件
键盘事件通常和焦点相关。当前焦点组件优先处理键盘事件;如果它不处理,事件可以继续交给上层或快捷键系统。
常见键:
- Enter:提交、触发默认动作或搜索下一项。
- Escape:关闭弹窗或取消编辑。
- Tab:焦点导航。
- Arrow keys:列表、树、表格和菜单导航。
手势和捕获
拖拽、滚动条、列宽调整、选区拖选等交互需要在 pointer down 后持续接收后续事件。组件应在交互结束、取消或销毁时释放相关状态。
ContextMenu
右键菜单通常根据当前命中对象生成局部命令。菜单项应来自当前上下文,而不是常驻在每个行或节点上。
设计原则
- 事件处理应尽量局部化。
- 不要在 pointer move 中做全量数据计算。
- 不要在事件处理里创建大量临时对象。
- 组件销毁时必须清理拖拽、弹窗、输入会话和订阅。