包含此页的版本:
不含此页的版本:
当用户按下方向键、移动纵杆或按下Escape,Enter或箭头键。它们指示用户正在尝试导航 UI,但它们不限于特定的输入设备,例如键盘。与 Focus 事件的区别在于,导航事件不需要焦点移动到新的 UI 元素。
所有导航事件的基类都是 NavigationEventBase。
所有导航事件都会涓涓细流、冒泡且可取消,但建议在冒泡传播阶段监听这些事件。这是因为导航事件是由输入事件触发的,这些输入事件也可用于与单个控件交互。例如,按钮将对按下Enter键,它将取消NavigationSubmitEvent. 在冒泡阶段监听这些事件可确保它们是导航事件。
| 事件 | 描述 | 涓涓细流 | 气泡升起 | 可取消 |
|---|---|---|---|---|
| 导航移动事件 | 当用户进行移动输入时发送。 | ✔ | ✔ | ✔ |
| 导航取消事件 | 当用户进行取消输入时发送。 | ✔ | ✔ | ✔ |
| 导航提交事件 | 当用户进行提交输入时发送。 | ✔ | ✔ | ✔ |
这NavigationMoveEvent当用户按下方向键、移动纵杆或按下箭头键时发送。
某些控件将使用箭头键来实现自己的功能。例如, ListView 允许用户使用向上和向下箭头键选择项。在这种情况下,控件将取消NavigationMoveEvent并且该事件不会进入冒泡阶段。
direction:导航方向。 (None,Left,Up,Right,Down)
move:移动向量。如果事件是由模拟轴输入(如纵杆)触发的,则此属性允许访问方向向量。
这NavigationCancelEvent当用户取消当前导航作(例如按键盘上的“Escape”键)时触发。请务必注意,此事件不会影响当前聚焦的元素,这意味着在取消之前具有焦点的 UI 元素仍处于选中状态。
这NavigationSubmitEvent当用户按下提交按钮时触发,例如按键盘上的“Enter”键。
如果控件本身处理事件,则会取消事件,防止其进入冒泡阶段。例如,具有焦点的 TextField 将停止NavigationSubmitEvent避免冒泡。另一方面,可聚焦的标签或图像将允许NavigationSubmitEvent冒泡到其父元素,允许它们在需要时处理事件。
以下代码示例演示如何在运行时 UI 中注册导航事件的回调:
using UnityEngine;
using UnityEngine.UIElements;
public class MyNavigationHandler: MonoBehaviour {
void OnEnable() {
// Get a reference to the root visual element
var uiDocument = GetComponent < UIDocument > ();
var rootVisualElement = uiDocument.rootVisualElement;
// Register for navigation events
rootVisualElement.RegisterCallback < NavigationCancelEvent > (OnNavCancelEvent);
rootVisualElement.RegisterCallback < NavigationMoveEvent > (OnNavMoveEvent);
rootVisualElement.RegisterCallback < NavigationSubmitEvent > (OnNavSubmitEvent);
}
private void OnNavSubmitEvent(NavigationSubmitEvent evt) {
Debug.Log($"OnNavSubmitEvent {evt.propagationPhase}");
}
private void OnNavMoveEvent(NavigationMoveEvent evt) {
Debug.Log($"OnNavMoveEvent {evt.propagationPhase} - move {evt.move} - direction {evt.direction}");
}
private void OnNavCancelEvent(NavigationCancelEvent evt) {
Debug.Log($"OnNavCancelEvent {evt.propagationPhase}");
}
}