UIElement.PointerEntered 事件
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
当指针进入此元素的命中测试区域时发生。
public:
virtual event PointerEventHandler ^ PointerEntered;
// Register
event_token PointerEntered(PointerEventHandler const& handler) const;
// Revoke with event_token
void PointerEntered(event_token const* cookie) const;
// Revoke with event_revoker
UIElement::PointerEntered_revoker PointerEntered(auto_revoke_t, PointerEventHandler const& handler) const;
public event PointerEventHandler PointerEntered;
function onPointerEntered(eventArgs) { /* Your code */ }
uIElement.addEventListener("pointerentered", onPointerEntered);
uIElement.removeEventListener("pointerentered", onPointerEntered);
- or -
uIElement.onpointerentered = onPointerEntered;
Public Custom Event PointerEntered As PointerEventHandler
<uiElement PointerEntered="eventhandler"/>
事件类型
注解
PointerEntered 事件将触发,以响应移动到元素边界区域的指针。 触摸、鼠标和笔/触笔交互在 UWP 应用中作为指针输入进行接收、处理和管理。 其中任何设备及其交互都可以生成 PointerEntered 事件。 有关详细信息,请参阅 处理指针输入 和本主题中的其他说明。
PointerEntered 是路由事件。 有关路由事件概念的详细信息,请参阅 事件和路由事件概述。
使用基于 PointerEventHandler 的处理程序来处理此事件。
对于触摸操作以及特定于交互的事件或一个触摸操作引起的操作事件,一个元素必须对点击测试可见,以用作事件源并触发与该操作关联的事件。 UIElement.Visibility 必须为 Visible。 派生类型的其他属性也会影响命中测试可见性。 有关详细信息,请参阅事件和路由事件概述。
PointerEntered 支持将事件处理程序附加到将调用的路由,即使事件的事件数据标记为“ 已处理”也是如此。 请参阅 AddHandler。
特定Windows 运行时控件可能对 PointerEntered 输入事件具有基于类的处理。 如果是这样,控件可能具有 OnPointerEntered 方法的替代。 通常,事件未标记为由类处理程序处理,因此 PointerEntered 事件仍可由 UI 中控件的用户代码处理。 有关事件基于类的处理工作原理的详细信息,请参阅 事件和路由事件概述。
鼠标和笔/触笔输入的 PointerEntered
鼠标输入设备具有屏幕光标,每当鼠标移动时都可见,即使当时未按下鼠标按钮也是如此。 PointerEntered 事件将在元素触发的第一个 PointerMoved 事件之前。 类似的行为可用于笔设备输入,其中输入设备可以检测到触笔正悬停在输入设备图面上, (IsInRange) 但不触摸它。 因此,鼠标和笔设备输入将在与触摸事件略有不同的情况下触发 PointerEntered 事件。 有关详细信息,请参阅鼠标交互。
用于触摸输入的 PointerEntered
仅当手指触摸表面时,才能检测到触摸点。 每当触摸操作导致 PointerPressed 事件时,该事件前面紧接一个 PointerEntered 事件,所有事件数据都是两个事件的相同信息, (相同的指针 ID、相同的位置等。) 换句话说,指针被视为在此时进入元素,并且该元素被触摸点触摸的位置。
或者,如果指针在移动时与表面保持恒定接触,并进入元素的命中测试边界,则触摸点将生成 PointerEntered。 对于这些类型的触摸操作,还可以将操作处理为操作或手势,而不是指针事件。 有关详细信息,请参阅 处理指针输入。
PointerEntered 的路由事件行为
PointerEntered 是路由事件。 有关路由事件概念的详细信息,请参阅 事件和路由事件概述。 可以为 XAML UI 中的元素(包括父子关系中的元素)定义多个 PointerEntered 事件。 在典型的 UI 组合中,子元素位于父元素边界内的某个位置,因此当指针移动到父元素时,将首先针对父元素发生 PointerEntered 事件,然后当指针移动到父元素时,对于子元素,则先发生 PointerEntered 事件。 当子元素触发该事件时,PointerEntered 事件通常不会气泡到父元素,因为从概念上讲,指针已在父边界内,并且输入系统将 PointerEntered 事件也路由到父级时会感到困惑。 通常,你不希望 PointerEntered 事件路由,你只想从发送方处理它们。 可以通过在处理程序中将 Handled 设置为 true 来显式阻止事件路由。
在极少数情况下,可以看到指向父级的 PointerEntered 事件气泡。 例如,如果使用 RenderTransform 将子元素偏移到其父元素的边界之外,则输入子元素时,事件会气泡到父元素,并按子元素触发事件的方式提供事件信息。
指针捕获
如果另一个元素已捕获指针,即使捕获的指针进入元素的边界,PointerEntered 也不会触发。 但是,如果在指针位于 元素上时释放指针捕获,则 PointerEntered 将触发,即使认为在这种情况下指针可能保持静止。 事件数据中的 GetCurrentPoint 值可能是元素中间某个位置的点,而不是其边缘的点,因为释放捕获时指针已经位于元素上。 有关指针捕获的详细信息,请参阅 CapturePointer 或 鼠标交互。
PointerOver 控件的视觉状态
只有指针位于控件边界上时,具有控件模板的控件才能应用处于活动状态的视觉状态。 无需始终处理 PointerEntered 或 PointerExited 即可获取或更改此行为。 可能需要重新创建控件模板。 如果派生自已具有调用视觉状态的低级别输入处理的现有控件,则应在“CommonStates” VisualStateGroup 中提供名为“PointerOver”的视觉状态,并且当指针位于控件上时,内置控件逻辑将加载该视觉状态。 指针悬停的视觉状态通常存在于可调用或选择的控件上,例如 Button 或 ListViewItem。 如果派生自的基类(如 Control )没有调用视觉状态的内置输入事件处理,可能需要重写 OnPointerEntered 和 OnPointerExited 才能获取此行为。 有关详细信息,请参阅视觉状态的情节提要动画。
Windows 8 行为
对于 Windows 8,如果屏幕光标 (、触笔或触摸点) 实际未移动,则通常不会触发 PointerEntered 事件。 例如,如果鼠标及其屏幕光标保持静止,并且具有 PointerEntered 处理程序的对象已转换或调整其位置以在屏幕光标下方移动,则 PointerEntered 不会触发。 或者,如果弹出窗口或浮出控件等元素消失,并且指针现在位于新元素 (但指针尚未) 移动,则 PointerEntered 不会触发。 与此相关的是 PointerExited 行为。 例如,如果弹出窗口以编程方式关闭,则如果指针未作为消除它的原因移动,则不会触发 PointerExited 。 如果指针在最近显示的元素上移动,你仍会收到 PointerEntered 事件,但这要由用户决定,这是否会发生,以及它发生在移动时,而不是在解除的时刻发生。 简而言之,尝试使用最后一个触发 PointerEntered 的元素在应用 UI 中用于指针状态确定,在 Windows 8 中并不全面,而且在很多情况下 PointerEntered 和 PointerExited 不会配对。 这也会影响使用 PointerEntered 和 PointerExited 作为触发器的控件的视觉状态。
从Windows 8.1开始,当指针一次触发 PointerEntered 事件时,都会触发 PointerExited,但如果指针不再位于该元素中,则会发生一些 UI 状态更改。 这包括整个元素消失的情况。 如果指针现在位于其他元素上,因为以前的元素消失,则即使指针永远不会移动,该元素也会触发 PointerEntered。 以编程方式将其可见性设置为 Collapsed 的元素是元素可能从 UI 中消失的一种方式,Windows 8.1行为对此进行了说明,并将为折叠元素触发 PointerExited,为新显示的元素触发 PointerEntered。
如果你将应用代码从 Windows 8 迁移到 Windows 8.1则可能需要考虑此行为更改,因为这会导致 PointerExited 和 PointerEntered 在以前不会触发的情况下被触发。
对于针对 Windows 8 编译的应用,如果它在 Windows 8.1 上运行,将继续使用 Windows 8 行为。