UI 自动化拖放支持
Microsoft UI 自动化定义了用于支持拖放方案的两种控件模式:拖动控件模式和 DropTarget 控件模式。 为可拖动的元素实现拖动控件模式,为可接收拖动元素的元素实现 DropTarget 控件模式;即放置目标。 这两种控件模式公开了辅助技术可用于帮助辅助功能用户完成拖放操作的信息。
拖动样式
为可拖动元素实现 拖动 控件模式时,需要决定是实现 源/目标 拖动样式还是 仅实现源拖动 样式。
源/目标样式
在拖放的源/目标样式中,拖动的元素 (“source”) ,而“target”) (拖放目标元素是不同的,并且每个元素都会引发一组不同的事件。 下面是使用源/目标样式的拖动操作的生命周期:
- 当用户启动拖动操作时:
- 源引发 DragStart (UIA_Drag_DragStartEventId) 事件。
- 源将 IDragProvider::IsGrabbed 属性设置为 TRUE。
- 目标更新其 DropTargetEffect 属性。
- 目标引发 DragEnter (UIA_DropTarget_DragEnterEventId) 事件。
- 目标将引发 DragLeave (UIA_DropTarget_DragLeaveEventId) 事件。
- 源引发 DragCancel (UIA_Drag_DragCancelEventId) 事件。
- 源将 IDragProvider::IsGrabbed 属性设置为 FALSE。
- 源引发 DragComplete (UIA_Drag_DragCompleteEventId) 事件。
- 源将 IDragProvider::IsGrabbed 属性设置为 FALSE。
- 目标设置 IDropTargetProvider::D ropTargetEffect 属性以指示发生的效果。
- 目标引发 Dropped (UIA_DropTarget_DroppedEventId) 事件。
当拖动操作进入目标区域时:
拖动操作离开目标区域时:
当用户将拖动的项释放到非目标上时:
当用户将拖动的项释放到目标上时:
源和目标对象中的事件密切相关,但不同。 有关正在拖动的内容的数据来自源,而有关“可能发生的情况”和“发生的情况”的数据来自目标。
当拖动操作正在进行时,拖动的项可以在操作完成之前任意次数地拖入和拖出目标区域。
任何需要动态更新其 IDropTargetProvider::D ropTargetEffect 属性的放置目标都应在该属性上引发其他属性更改事件。
仅源样式
仅源拖动样式允许提供程序避免实现放置目标。 不实现放置目标有助于降低实现成本,但不会为辅助功能客户端应用程序提供有关接收删除的对象的任何信息。 下面是使用仅源样式的拖动操作的生命周期:
- 当用户启动拖动操作时:
- 源引发 DragStart (UIA_Drag_DragStartEventId) 事件。
- 源将 IDragProvider::IsGrabbed 属性设置为 TRUE。
- 源将 IDragProvider::D ropEffect 属性设置为适当的值。
- 源将 IDragProvider::D ropEffect 属性设置为适当的值。
- 源引发 DragCancel (UIA_Drag_DragCancelEventId) 事件。
- 源将 IDragProvider::IsGrabbed 属性设置为 FALSE。
- 源引发 DragComplete (UIA_Drag_DragCompleteEventId) 事件。
- 源设置 IDragProvider::D ropEffect 属性,以指示删除项时发生的效果。
当拖动操作进入目标区域时:
拖动操作离开目标区域时:
当用户将拖动的项释放到非目标上时:
当用户将拖动的项释放到目标上时:
拖动多个项目
如果提供程序实现拖放操作,其中用户可以同时拖动多个对象,则提供程序使用源/目标或仅源样式,如上一部分所述,但有一点区别。 当用户开始拖动操作时,提供程序将创建一个主源元素,该元素表示正在拖动的整个项集。 master 源元素代表拖动的项集引发所有事件;项不会引发其自己的任何事件。
- 当用户启动拖动操作时:
- 提供程序创建主源元素。
- master 源元素引发 DragStart (UIA_Drag_DragStartEventId) 事件。
- master 源元素将 IDragProvider::IsGrabbed 属性设置为 TRUE。
- master 源元素更新已抓取项的列表,以包含要拖动的所有项,以便 GetGrabbedItems 方法可以检索列表。
在这一点上,主源元素执行的角色与源元素的角色相同,如上一部分所述。
用于拖放的客户端接口
UI 自动化客户端应用程序使用 IUIAutomationDragPattern 和 IUIAutomationDropTargetPattern 接口访问 UI 元素中的拖放信息。