Version: 6000.3
语言: 中文
事件参考
更改事件

捕获事件

捕获事件会通知您鼠标捕获状态的变化。UI 工具包有两种类型的捕获事件:

  • 鼠标捕获事件
  • 指针捕获事件

当元素捕获鼠标或指针时,它是唯一从指点设备接收事件的元素,直到设备释放或丢失捕获。

例如,如果单击文本框,则文本框会捕获鼠标。鼠标仍然可以在屏幕上移动,但不会触发文本框之外的事件。只要文本框捕获了您的鼠标,它就不会触发其他事件。当用户在文本框外按下鼠标上的按钮时,该框将释放其鼠标捕获。

事件 描述 涓涓细流 气泡升起 可取消
MouseCapture事件 当元素捕获鼠标时发送。
MouseCaptureOut事件 当元素释放或以其他方式丢失鼠标捕获时发送。
指针捕获事件 当元素捕获指针时发送。
PointerCaptureOutEvent 当元素释放指针时发送。

行为

鼠标捕获

鼠标捕获事件是指物理鼠标或模拟物理鼠标的虚拟鼠标上的事件。捕获鼠标也会导致PointerCaptureEvent鼠标指针。

当元素释放鼠标捕获时,相应的MouseCaptureOutEvent触发器,目标是请求释放捕获的元素。

永远不可能有两个元素同时捕获鼠标。如果另一个视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表
触发一个MouseCaptureEvent,发送原始MouseCaptureEvent失去捕获。这也会触发MouseCaptureOutEvent在原始元素上。

指针捕获

在 UI 工具包中,指针事件先于鼠标事件。如果指针类型是鼠标,捕获它也会触发相应的鼠标捕获事件。捕获指针也会捕获鼠标。

活动列表

MouseCapture事件

一个MouseCaptureEvent当元素捕获鼠标时,会发送事件。

target:获取捕获的元素。

MouseCaptureOut事件

一个MouseCaptureOutEvent当元素释放或丢失鼠标捕获时,会发送事件。

target:丢失捕获的元素。

指针捕获事件

一个PointerCaptureEvent当元素获取指针捕获时,会发送事件。

target:获取捕获的元素。

PointerCaptureOutEvent

一个PointerCaptureOutEvent当元素释放或丢失指针捕获时发送事件。

target:丢失捕获的元素。

例子

以下示例演示了捕获事件的行为,以及捕获和释放指针。

要查看示例的实际效果,请执行以下作:

  1. “编辑器>资源>脚本”下,创建一个名为 CaptureEventsTestWindow.cs 的新 C# 文件
  2. 将示例复制到 C# 脚本中。
  3. 从 编辑器工具栏(Editor Toolbar) 中,选择 窗口(Window) > UI 工具包(UI Toolkit) > 捕获事件测试窗口(Capture Events Test Window) 。
  4. 单击对话框窗口中的各种标签,然后观看控制台中的输出。
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");
        });
    }
}
事件参考
更改事件