版本:Unity 6 (6000.0)
语言:英语
布局事件
输入事件

焦点事件

当元素获得或失去焦点时,会发生焦点事件。

焦点事件在您需要将焦点更改到 视觉元素视觉树的节点,实例化或派生自 C# VisualElement 类。您可以设置外观、定义行为,并将其作为 UI 的一部分显示在屏幕上。 更多信息
参见 词汇表
和从视觉元素中更改焦点时很有用。控件通常使用焦点事件来更改其内容,具体取决于焦点状态。例如,文本字段可以在失去焦点时显示占位符文本,或者它可以响应 FocusInEvent 来清除占位符文本。

视觉元素上的焦点可以通过用户交互(如制表符或单击)或使用 C# 脚本允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以您喜欢的任何方式响应用户输入的代码片段。 更多信息
参见 词汇表
element.Focus() 进行更改。

焦点事件分为两种不同的类型

  • FocusOutEventFocusInEvent 在焦点发生变化之前沿着传播路径发送。
  • FocusEventBlurEvent 在焦点发生变化后立即发送到事件目标。

所有焦点事件的基类是 FocusEventBase

事件 描述 向下传播 向上冒泡 可取消
FocusOutEvent 在元素失去焦点之前发送。
FocusInEvent 在元素获得焦点之前发送。
BlurEvent 在元素失去焦点后发送。
FocusEvent 在元素获得焦点后发送。

独特属性

以下部分解释了焦点事件特有的相关属性。这不是焦点事件系列中所有属性的完整列表。有关完整列表,请参阅 API 文档中的 FocusEventBase

relatedTarget:包含作为事件的次要目标的视觉元素。对于 FocusOutBlur 事件,它包含获得焦点的元素。对于 FocusInFocus 事件,它包含失去焦点的元素。

事件 目标 relatedTarget
模糊 失去焦点的元素。 获得焦点的元素。
焦点 获得焦点的元素。 失去焦点的元素。
focusIn 获得焦点的元素。 失去焦点的元素。
focusOut 失去焦点的元素。 获得焦点的元素。

事件列表

FocusOutEvent

当元素即将失去焦点时,会发送 FocusOutEvent

target:即将失去焦点的元素。

relatedTarget:即将获得焦点的元素。

FocusInEvent

当元素即将获得焦点时,会发送 FocusInEvent

target:即将获得焦点的元素。

relatedTarget:即将失去焦点的元素。

BlurEvent

在元素失去焦点后,会发送 BlurEvent

target:失去焦点的元素。

relatedTarget:获得焦点的元素。

FocusEvent

在元素获得焦点后,会发送 FocusEvent

target:获得焦点的元素。

relatedTarget:失去焦点的元素。

示例

以下示例展示了如何在 TextField 中使用占位符文本。

在您通过 UXML 创建元素后,该脚本会将占位符文本分配给 TextField。当 TextField 处于焦点状态时,FocusInEvent 会触发并清除占位符文本。FocusOutEvent 会根据 TextField 内容切换占位符模式。

要查看实际示例,请执行以下操作

  1. 创建一个名为 PlaceHolderExample 的新 C# 脚本。
  2. 将示例代码复制到 C# 脚本中。
  3. 在 **窗口 > UI 工具包 > PlaceHolderExample** 下,打开新创建的编辑器窗口。
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

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

    private bool placeHolderMode = true;
    private const string placeHolderText = "Write here";

    public void CreateGUI()
    {
        TextField textField = new TextField();
        textField.value = placeHolderText;
        rootVisualElement.Add(textField);

        textField.RegisterCallback<FocusInEvent>(OnFocusInTextField);
        textField.RegisterCallback<FocusOutEvent>(OnFocusOutTextField);
    }

    private void OnFocusInTextField(FocusInEvent evt)
    {
        // If the text field just received focus and the user might want to write
        // or edit the text inside, the placeholder text should be cleared (if active)
        if (placeHolderMode)
        {
            var textField = evt.target as TextField;
            if (textField != null)
            {
                textField.value = "";
            }
        }
    }        

    private void OnFocusOutTextField(FocusOutEvent evt)
    {
        // If the text field is empty after the user is done editing and the
        // element lost focus, write placeholder text into the text field
        var textField = evt.target as TextField;
        if (textField != null)
        {
            placeHolderMode = string.IsNullOrEmpty(textField.value);
            if (placeHolderMode)
                textField.value = placeHolderText;
        }    
    }
}
布局事件
输入事件