UIElement.PointerExited 事件

定义

当指针离开此元素的命中测试区域时发生。

public:
 virtual event PointerEventHandler ^ PointerExited;
// Register
event_token PointerExited(PointerEventHandler const& handler) const;

// Revoke with event_token
void PointerExited(event_token const* cookie) const;

// Revoke with event_revoker
UIElement::PointerExited_revoker PointerExited(auto_revoke_t, PointerEventHandler const& handler) const;
public event PointerEventHandler PointerExited;
function onPointerExited(eventArgs) { /* Your code */ }
uIElement.addEventListener("pointerexited", onPointerExited);
uIElement.removeEventListener("pointerexited", onPointerExited);
- or -
uIElement.onpointerexited = onPointerExited;
Public Custom Event PointerExited As PointerEventHandler 
<uiElement PointerExited="eventhandler"/>

事件类型

注解

PointerExited 事件触发,以响应最初位于元素的边界区域中离开该边界区域的指针。 触摸、鼠标和笔/触笔交互在 UWP 应用中作为指针输入进行接收、处理和管理。 这些设备中的任何一个及其交互都可以生成 PointerExited 事件。 有关详细信息,请参阅本主题中的 处理指针输入 和其他备注。

使用基于 PointerEventHandler 的处理程序来处理此事件。

对于触摸操作以及特定于交互的事件或一个触摸操作引起的操作事件,一个元素必须对点击测试可见,以用作事件源并触发与该操作关联的事件。 UIElement.Visibility 必须为 Visible。 派生类型的其他属性也会影响命中测试可见性。 有关详细信息,请参阅事件和路由事件概述

PointerExited 支持将事件处理程序附加到将调用的路由,即使事件的事件数据标记为“ 已处理”也是如此。 请参阅 AddHandler

特定Windows 运行时控件可能对 PointerExited 输入事件具有基于类的处理。 如果是这样,控件可能具有 OnPointerExited 方法的替代。 通常,事件未标记为由类处理程序处理,因此 PointerExited 事件仍可由 UI 中控件的用户代码处理。 有关事件基于类的处理工作原理的详细信息,请参阅 事件和路由事件概述

如果另一个元素已捕获指针,即使捕获的指针离开元素的边界,PointerExited 也不会触发。 有关指针捕获的详细信息,请参阅 CapturePointer鼠标交互

指针已针对鼠标和笔/触笔输入使用

鼠标输入设备具有一个屏幕光标,每当鼠标移动时,该光标都可见,即使当时没有按下鼠标按钮。 类似的行为可用于笔设备输入,其中输入设备可以检测到触笔悬停在输入设备图面上, (IsInRange) 但不触摸它。 因此,鼠标和笔设备输入将在与触摸事件略有不同的情况下触发 PointerExited 事件。 有关详细信息,请参阅鼠标交互。 PointerExited 事件在元素触发的最后一个 PointerMoved 事件之后触发。

针对触摸输入的 PointerExited

仅当手指触摸表面时,才能检测到触摸点。 每当触摸操作导致 PointerReleased 事件时,该事件紧随 PointerExited 事件,所有事件数据都是两个事件的相同信息, (相同的指针 ID、相同的位置等。) 换句话说,指针被视为在触摸点触摸元素的时刻和位置进入元素。

或者,如果指针在移动时与图面保持恒定接触,最初位于元素上方,然后退出元素的命中测试边界,则触摸点将生成 PointerExited。 对于这些类型的触摸操作,还可以将操作作为操作或手势而不是指针事件进行处理。 有关详细信息,请参阅 处理指针输入

PointerExited 的路由事件行为

PointerExited 是路由事件。 有关路由事件概念的详细信息,请参阅 事件和路由事件概述。 可以为 XAML UI 中的元素(包括父子关系中的元素)定义多个 PointerExited 事件。 在典型的 UI 组合中,子元素位于父元素的边界内的某个位置,因此当指针移出子元素时,将首先针对子元素发生 PointerExited 事件,然后在指针完全移出该父元素时针对父元素发生。 当子元素触发 PointerExited 事件时,通常不会浮升到父元素,因为输入系统将 PointerExited 事件也路由到父级时会令人困惑。 通常,你不希望 PointerExited 事件路由,你只想从发送方处理它们。 可以通过在处理程序中将 Handled 设置为 true 来显式阻止事件路由。

在极少数情况下,可能会看到指向父级的 PointerExited 事件气泡。 例如,如果已使用 RenderTransform 来偏移其父元素边界之外的子元素,则事件会在子元素退出时浮升到父元素,并提供子元素触发事件的方式所报告的事件信息。

PointerOver 控件的视觉状态

只有指针位于控件边界上时,具有控件模板的控件才能应用处于活动状态的视觉状态。 无需始终处理 PointerEntered 或 PointerExited 即可获取或更改此行为。 可能需要重新创建控件模板。 如果派生自已具有调用视觉状态的低级别输入处理的现有控件,则应在“CommonStates” VisualStateGroup 中提供名为“PointerOver”的视觉状态,并且只要指针位于控件上,内置控件逻辑就会加载该视觉状态。 指针悬停的视觉状态通常存在于可调用或选择的控件上,如 ButtonListViewItem。 如果派生自没有调用视觉状态的内置输入事件处理的基类(如 Control ),可能需要重写 OnPointerEnteredOnPointerExited 自己才能获取此行为。 使用 OnPointerExited 调用 GoToState 以加载“PointerOver”状态以外的状态,例如“Normal”。 有关详细信息,请参阅视觉状态的情节提要动画

Windows 8 行为

对于 Windows 8,如果屏幕上的光标 (、触笔或触摸点) 实际未移动,则 PointerEntered 事件通常不会触发。 例如,如果鼠标及其屏幕上的光标保持静止,并且具有 PointerEntered 处理程序的对象的位置已转换或以其他方式调整为在屏幕光标下方移动,则 PointerEntered 不会触发。 或者,如果弹出窗口或浮出控件等元素消失,并且指针现在位于新元素 (但指针尚未) 移动,则不会触发 PointerEntered 。 与此相关的是 PointerExited 行为。 例如,如果以编程方式消除弹出窗口,则当指针未移动时,它不会触发 PointerExited 作为消除它的原因。 如果指针在新显示的元素上移动时,你仍会收到 PointerEntered 事件,但这要由用户决定是否发生,并且该事件发生在移动时,而不是在解除时发生。 简言之,尝试使用最后一个触发 PointerEntered 的元素在 Windows 8 中并不全面地确定指针状态,并且许多情况下 PointerEntered 和 PointerExited 不会配对。 这也会影响使用 PointerEntered 和 PointerExited 作为触发器的控件的视觉状态。

从 Windows 8.1 开始,当指针一次触发 PointerEntered 事件时,都会触发 PointerExited,但如果指针不再位于该元素中,则会发生一些 UI 状态更改。 这包括整个元素消失的情况。 如果指针现在位于其他元素上,因为上一个元素消失,该元素将触发 PointerEntered,即使指针永远不会移动。 以编程方式将其 Visibility 设置为 Collapsed 的元素是元素可能会从 UI 中消失的一种方式,Windows 8.1行为会对此进行说明,并将为 Collapsed 元素触发 PointerExited,为新显示的元素触发 PointerEntered

如果你将应用代码从 Windows 8 迁移到Windows 8.1可能需要考虑此行为更改,因为这会导致 PointerExited 和 PointerEntered 在以前未触发的情况下被触发。

对于针对 Windows 8 编译的应用,如果它在 Windows 8.1 上运行,将继续使用 Windows 8 行为。

适用于

另请参阅