包含此页的版本:
不含此页的版本:
当您使用鼠标与 UI 交互时,会发生鼠标事件。触摸、笔或其他指点设备会生成其他事件,而不是鼠标事件。 在鼠标事件 API 和本文档中,术语“鼠标”仅指模拟物理鼠标或模拟物理鼠标的虚拟鼠标。
鼠标事件之前始终有相应的PointerEvent.
所有鼠标事件的基类都是 MouseEventBase。
| 事件 | 描述 | 涓涓细流 | 气泡升起 | 可取消 |
|---|---|---|---|---|
| 鼠标下降事件 | 当用户按下鼠标按钮时发送。 | 是的 | 是的 | 是的 |
| MouseUp事件 | 当用户释放鼠标按钮时发送。 | 是的 | 是的 | 是的 |
| 鼠标移动事件 | 当用户移动鼠标时发送。 | 是的 | 是的 | 是的 |
| 车轮事件 | 当用户激活鼠标滚轮时发送。 | 是的 | 是的 | 是的 |
| 鼠标进入窗口事件 | 当鼠标进入窗口时发送。 | 是的 | ||
| 鼠标离开窗口事件 | 当鼠标离开窗口时发送。 | 是的 | ||
| MouseEnter事件 | 当鼠标进入元素或其后代之一时发送。 | 是的 | 是的 | |
| MouseLeave事件 | 当鼠标离开某个元素或其后代之一时发送。 | 是的 | 是的 | |
| MouseOver事件 | 当鼠标进入元素时发送。 | 是的 | 是的 | 是的 |
| 鼠标输出事件 | 当鼠标离开元素时发送。 | 是的 | 是的 | 是的 |
| ContextClickEvent(已过时) | 当用户按下并释放第三个鼠标按钮时发送。存在是为了向后兼容 IMGUI。 | 是的 | 是的 | 是的 |
button:这button属性返回一个整数,用于标识按下以触发事件的鼠标按钮。下表列出了整数和关联的鼠标按钮:
| 整数 | 按钮 |
|---|---|
| 0 | 左键 |
| 1 | 右键 |
| 2 | 中间按钮 |
pressedButtons:这pressedButton属性返回一个整数,用于标识当前按下的鼠标按钮组合。
该数字是各个按钮的整数值之和(见下表)。例如,同时按住鼠标右键和鼠标中键将导致 pressedButton 的值为 6。
| 整数 | 按钮 |
|---|---|
| 1 | 左键 |
| 2 | 右键 |
| 4 | 中间按钮 |
modifiers:这modifiers属性返回在键盘事件期间按下的修饰键。修饰符的一些示例是Shift,Ctrl或Alt钥匙。
有关更多信息,请参阅 MDN 文档的修饰键部分。
mousePosition:这mousePosition属性返回面板内的鼠标位置,也称为屏幕坐标系。有关面板坐标的更多信息,请参阅可视化树页面。
localMousePosition:这localMousePosition属性返回相对于目标的坐标视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表.
mouseDelta:指针在上一个鼠标事件期间的位置与当前鼠标事件期间指针的位置之间的差值。
以下列表提供了事件系列中每个事件的名称、描述和目标。有关事件的详细信息,请参阅 UI 工具包 API。
当光标位于可视元素内时按下鼠标按钮时,将发送 MouseDownEvent。
target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
当光标位于视觉元素内时释放鼠标按钮时,将触发 MouseUpEvent 。MouseUpEvent免费提供MouseDownEvent.
target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
当光标热点在视觉元素中移动时,将发送 MouseMoveEvent。
target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
按下鼠标滚轮时发送 WheelEvent。
target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
当光标移动到编辑器窗口时,将触发 MouseEnterWindowEvent 。当您进入 游戏视图(Game view) 窗口时,运行时面板不会收到此事件。
target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
MouseLeaveWindowEvent 在光标退出编辑器窗口的空间时触发。这MouseLeaveWindowEvent是MouseEnterWindowEvent.
target:接收鼠标捕获的视觉元素。否则,它返回 null,因为光标不在元素上。
当光标移动到可视元素或其后代之一时,将发送 MouseEnterEvent。
target:鼠标光标下的可视元素,或其后代之一。
当光标移动到视觉元素之外时,MouseLeaveEvent 会触发。此事件与MouseOutEvent当此事件发送到每个元素时,鼠标退出。此事件不会传播。
target:鼠标光标退出的视觉元素(或其后代之一)。
当光标进入元素时,将发送 MouseOverEvent。这与MouseEnterEvent,因为此事件仅发送到输入的元素。
target:鼠标光标下方的视觉元素。
当指向设备将光标移动到视觉元素的边界之外时,将触发 MouseOutEvent 。
MouseOutEvent与MouseLeaveEvent在那MouseOutEvent在将视觉元素留给任何其他元素时发送,而MouseLeaveEvent从视觉元素过渡到后代元素时不会发送。
target:鼠标光标退出的视觉元素。
由ContextualMenuManager当上下文菜单需要填充菜单项时。
target:正在为其构建上下文菜单的视觉元素。
当用户按下并释放第三个鼠标按钮时发送的事件。此事件仅用于向后兼容 IMGUI。
以下代码示例创建了一个包含三个按钮的编辑器窗口,当鼠标移动到元素上或按下鼠标上的按钮时,该按钮将消息打印到控制台。
此代码示例突出显示了两者的事件触发MouseDownEvent和MouseEnterEvent,以及如何使用事件参数。
要查看示例的实际效果,请执行以下作:
MouseEventTestWindow.cs.using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
// Open this in the Editor via the menu Window > UI ToolKit > Mouse Event Test Window
public class MouseEventTestWindow : EditorWindow
{
[MenuItem("Window/UI Toolkit/Mouse Event Test Window")]
public static void ShowExample()
{
MouseEventTestWindow wnd = GetWindow<MouseEventTestWindow>();
wnd.titleContent = new GUIContent("Mouse Event Test Window");
}
public void CreateGUI()
{
// Add a few buttons
for (int i = 0; i < 3; i++)
{
Button newElement = new Button { name = $"Button {i}", text = $"Button {i}" };
newElement.style.flexGrow = 1;
rootVisualElement.Add(newElement);
}
// Register mouse event callbacks
rootVisualElement.RegisterCallback<MouseDownEvent>(OnMouseDown, TrickleDown.TrickleDown);
rootVisualElement.RegisterCallback<MouseEnterEvent>(OnMouseEnter, TrickleDown.TrickleDown);
}
private void OnMouseDown(MouseDownEvent evt)
{
bool leftMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.LeftMouse));
bool rightMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.RightMouse));
bool middleMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.MiddleMouse));
Debug.Log($"Mouse Down event. Triggered by {(MouseButton)evt.button}.");
Debug.Log($"Pressed buttons: Left button: {leftMouseButtonPressed} Right button: {rightMouseButtonPressed} Middle button: {middleMouseButtonPressed}");
}
private void OnMouseEnter(MouseEnterEvent evt)
{
VisualElement targetElement = (VisualElement)evt.target;
Debug.Log($"Mouse is now over element '{targetElement.name}'");
}
}
以下代码示例在按下任何鼠标按钮时将消息打印到控制台,显示哪个按钮触发了事件,以及当前按下了哪些按钮。
此代码示例重点介绍了将回调注册到MouseDownEvent以及如何使用事件参数。
要查看示例的实际效果,请执行以下作:
using UnityEngine;
using UnityEngine.UIElements;
public class MouseEventTestRuntime : MonoBehaviour
{
void Start()
{
var root = GetComponent<UIDocument>().rootVisualElement;
var newLabel = new Label("Move the mouse or press buttons to see the log output");
newLabel.style.flexGrow = 1;
root.Add(newLabel);
root.RegisterCallback<MouseDownEvent>(OnMouseDown, TrickleDown.TrickleDown);
}
private void OnMouseDown(MouseDownEvent evt)
{
bool leftMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.LeftMouse));
bool rightMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.RightMouse));
bool middleMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.MiddleMouse));
VisualElement targetElement = (VisualElement)evt.target;
Debug.Log($"Mouse Down event. Triggered by {(MouseButton)evt.button} over element '{targetElement.name}'");
Debug.Log($"Pressed buttons: Left button: {leftMouseButtonPressed} Right button: {rightMouseButtonPressed} Middle button: {middleMouseButtonPressed}");
}
}