Version: 2020.3
指针事件
IMGUI 事件

工具提示事件

发送提示事件可以检查指针下方的视觉元素是否能够显示工具提示。该事件只能在编辑器中使用。

工具提示通常使用 tooltip 属性设置。通过响应工具提示事件,您还可以设置工具提示。

您可以通过两种方式处理工具提示事件:

1.设置对 TooltipEvent 的回调。这会向未设置的视觉元素添加工具提示。这也可以覆盖视觉元素已设置的工具提示。 2.声明一个自定义的 VisualElement(例如声明一个扩展 VisualElement 的类),并覆盖 ExecuteDefaultAction 方法。

如果您设置回调或实现自定义视觉元素来声明工具提示,请不要通过代码或 UXML 设置 tooltip 属性的值。

当您设置一个 tooltip 属性时,鼠标光标下的视觉元素会自动注册一个回调来处理 TooltipEvent。此回调还会停止事件的进一步传播。

如果注册自定义回调来处理 TooltipEvent,则必须停止事件的传播,否则工具提示可以稍后在传播阶段被覆盖。

工具提示事件的基类是 EventBase 类。

事件 描述 涓滴 冒泡 可取消
TooltipEvent 在 Unity 显示工具提示之前发送。

独特的属性

rect:面板坐标系中的悬停视觉元素的矩形。

tooltiptooltip 属性是在 tooltip 事件期间显示在工具提示框内的文本字符串。以下回调事件在事件期间设置工具提示属性:

   evt.tooltip = "Tooltip set by parent!";

事件列表

TooltipEvent

在 Unity 编辑器显示工具提示之前发送 TooltipEvent。处理程序应该设置 TooltipEvent.tooltip 字符串和 TooltipEvent.rect

target:鼠标下的视觉元素。

示例

以下示例显示了“ToolTipEvent”的行为。

要查看示例:

1.在 Assets > Scripts > Editor 下,创建一个 C# 脚本,名为 SampleWindow。 2.将以下示例之一复制到 C# 脚本。 3.从编辑器工具栏中,选择 Window > UI Toolkit > SampleWindow

Example 1: Registering a callback to the TooltipEvent on the parent visual element

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class SampleWindow : EditorWindow
{
   [MenuItem("Window/UI Toolkit/SampleWindow")]
   public static void ShowExample()
   {
       SampleWindow wnd = GetWindow<SampleWindow>();
       wnd.titleContent = new GUIContent("SampleWindow");
   }

   public void CreateGUI()
   {
       VisualElement label = new Label("Hello World! This is a UI Toolkit Label.");
       rootVisualElement.Add(label);

       label.tooltip = "And this is a tooltip";

       // If you comment out the registration of the callback, the tooltip that displays for the label is "And this is a tooltip".
       // If you keep the registration of the callback, the tooltip that displays for the label (and any other child of rootVisualElement)
       // is "Tooltip set by parent!".
       rootVisualElement.RegisterCallback<TooltipEvent>(evt =>
       {
           evt.tooltip = "Tooltip set by parent!";
           evt.rect = (evt.target as VisualElement).worldBound;
           evt.StopPropagation();
       }, TrickleDown.TrickleDown); // Pass the TrickleDown.TrickleDown parameter to intercept the event before it reaches the label.
   }
}

Example 2: Declaring a custom visual element and overriding ExecuteDefaultAction

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class SampleWindow : EditorWindow
{
   [MenuItem("Window/UI Toolkit/SampleWindow")]
   public static void ShowExample()
   {
       SampleWindow wnd = GetWindow<SampleWindow>();
       wnd.titleContent = new GUIContent("SampleWindow");
   }

   private void CreateGUI()
   {
       CustomLabel custom1 = new CustomLabel("custom 1");
       rootVisualElement.Add(custom1);

       CustomLabel custom2 = new CustomLabel("custom 2");
       rootVisualElement.Add(custom2);
   }
}

public class CustomLabel : Label
{
   private static int m_InstanceCounter = 0;

   private int m_CurrentCounter;

   public CustomLabel(string labelText) : base(labelText)
   {
       m_CurrentCounter = m_InstanceCounter++;
   }

   protected override void ExecuteDefaultAction(EventBase evt)
   {
       // 其他事件需要照常处理。
       base.ExecuteDefaultAction(evt);

       if (evt.eventTypeId == TooltipEvent.TypeId())
       {
           TooltipEvent e = (TooltipEvent)evt;

           // Apply an offset to the tooltip position.
           var tooltipRect = new Rect(worldBound);
           tooltipRect.x += 10;
           tooltipRect.y += 10;
           e.rect = tooltipRect;

           // 设置自定义/动态工具提示。
           e.tooltip = $"This is instance # {m_CurrentCounter + 1} of my CustomLabel";

           // 停止传播可避免处理此事件的其他实例可能覆盖此处设置的值。Stop propagation avoids other instances of handling of the event that may override the values set here.
           e.StopPropagation();
       }
   }
}

指针事件
IMGUI 事件