包含此页的版本:
不含此页的版本:
捕获事件会通知您鼠标捕获状态的变化。UI 工具包有两种类型的捕获事件:
当元素捕获鼠标或指针时,它是唯一从指点设备接收事件的元素,直到设备释放或丢失捕获。
例如,如果单击文本框,则文本框会捕获鼠标。鼠标仍然可以在屏幕上移动,但不会触发文本框之外的事件。只要文本框捕获了您的鼠标,它就不会触发其他事件。当用户在文本框外按下鼠标上的按钮时,该框将释放其鼠标捕获。
| 事件 | 描述 | 涓涓细流 | 气泡升起 | 可取消 |
|---|---|---|---|---|
| MouseCapture事件 | 当元素捕获鼠标时发送。 | ✔ | ✔ | |
| MouseCaptureOut事件 | 当元素释放或以其他方式丢失鼠标捕获时发送。 | ✔ | ✔ | |
| 指针捕获事件 | 当元素捕获指针时发送。 | ✔ | ✔ | |
| PointerCaptureOutEvent | 当元素释放指针时发送。 | ✔ | ✔ |
鼠标捕获事件是指物理鼠标或模拟物理鼠标的虚拟鼠标上的事件。捕获鼠标也会导致PointerCaptureEvent鼠标指针。
当元素释放鼠标捕获时,相应的MouseCaptureOutEvent触发器,目标是请求释放捕获的元素。
永远不可能有两个元素同时捕获鼠标。如果另一个视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表触发一个MouseCaptureEvent,发送原始MouseCaptureEvent失去捕获。这也会触发MouseCaptureOutEvent在原始元素上。
在 UI 工具包中,指针事件先于鼠标事件。如果指针类型是鼠标,捕获它也会触发相应的鼠标捕获事件。捕获指针也会捕获鼠标。
一个MouseCaptureEvent当元素捕获鼠标时,会发送事件。
target:获取捕获的元素。
一个MouseCaptureOutEvent当元素释放或丢失鼠标捕获时,会发送事件。
target:丢失捕获的元素。
一个PointerCaptureEvent当元素获取指针捕获时,会发送事件。
target:获取捕获的元素。
一个PointerCaptureOutEvent当元素释放或丢失指针捕获时发送事件。
target:丢失捕获的元素。
以下示例演示了捕获事件的行为,以及捕获和释放指针。
要查看示例的实际效果,请执行以下作:
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class CaptureEventsTestWindow : EditorWindow
{
[MenuItem("Window/UI Toolkit/Capture Events Test Window")]
public static void ShowExample()
{
var wnd = GetWindow<CaptureEventsTestWindow>();
wnd.titleContent = new GUIContent("Capture Events Test Window");
}
private bool m_IsCapturing = false;
public void CreateGUI()
{
// Add a few clickable labels that print a message to the console when clicked
for (int i = 0; i < 4; i++)
{
Label clickableLabel = new Label($"Label {i} - Click Me!");
clickableLabel.RegisterCallback<MouseDownEvent>((evt) => { Debug.Log($"Clicked on label '{(evt.target as Label).text}'"); });
rootVisualElement.Add(clickableLabel);
}
// Now add a label that captures the pointer
Label capturingLabel = new Label("Click here to capture mouse");
capturingLabel.RegisterCallback<MouseDownEvent>((evt) =>
{
if (!m_IsCapturing)
{
capturingLabel.text = "Click here to release mouse";
MouseCaptureController.CaptureMouse(capturingLabel);
m_IsCapturing = true;
}
else
{
capturingLabel.text = "Click here to capture mouse";
MouseCaptureController.ReleaseMouse(capturingLabel);
m_IsCapturing = false;
}
});
rootVisualElement.Add(capturingLabel);
// Register callbacks to print a message when the mouse is captured or released
rootVisualElement.RegisterCallback<MouseCaptureEvent>((evt) =>
{
Debug.Log("Mouse captured");
});
rootVisualElement.RegisterCallback<MouseCaptureOutEvent>((evt) =>
{
Debug.Log("Mouse captured released");
});
}
}