版本:Unity 6 (6000.0)
语言:英语
指针事件
过渡事件

工具提示事件

工具提示事件用于检查指针下方的视觉元素视觉树中的节点,实例化或派生自 C# VisualElement 类。您可以为其设置外观、定义行为,并将其作为 UI 的一部分显示在屏幕上。 更多信息
参见 词汇表
是否能够显示工具提示。这是一个仅限编辑器的事件。

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

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

  1. TooltipEvent 设置回调函数。这会为没有设置工具提示的视觉元素添加工具提示。这也可以覆盖为视觉元素设置的工具提示。
  2. 声明一个自定义视觉元素(例如,声明一个扩展 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 下,创建一个名为 SampleWindow 的 C# 脚本。
  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";

       // 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.
   }
}

示例 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)
   {
       // Other events need to be handled as usual.
       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;

           // Set a custom/dynamic tooltip. 
           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();
       }
   }
}

指针事件
过渡事件