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

示例 1:在父视觉元素上注册一个 TooltipEvent 的回调。

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";

       // 如果注释掉回调的注册,则为标签显示的工具提示为 "And this is a tooltip"。
       // 如果您保留回调的注册,则为标签(以及 rootVisualElement 的任何其他子项)显示的工具提示
       // 为 "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); // 传递 TrickleDown.TrickleDown 参数以在事件到达标签之前拦截事件。
   }
}

示例 2:声明自定义视觉元素并覆盖 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 事件