Version: 6000.3
语言: 中文
布局事件
输入事件

焦点事件

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

当需要将焦点更改为焦点或将焦点更改为焦点时,焦点事件非常有用视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表
.控件通常使用焦点事件来更改其内容,具体取决于焦点状态。例如,文本字段可以在未焦点时显示占位符文本,也可以对FocusInEvent以清除占位符文本。

焦点可以通过用户交互(例如 Tab 键或单击)或使用 C# 更改视觉元素脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
element.Focus().

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

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

所有焦点事件的基类都是 FocusEventBase

事件 描述 涓涓细流 气泡升起 可取消
焦点活动 在元素失去焦点之前发送。
焦点事件 在元素获得焦点之前发送。
模糊事件 在元素失去焦点后发送。
焦点事件 在元素获得焦点后发送。

独特的属性

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

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

事件 目标 相关目标
模糊 失去焦点的元素。 获得焦点的元素。
重点 获得焦点的元素。 失去焦点的元素。
focusIn 获得焦点的元素。 失去焦点的元素。
焦点输出 失去焦点的元素。 获得焦点的元素。

活动列表

焦点活动

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

target:将失去焦点的元素。

relatedTarget:将获得焦点的元素。

焦点事件

FocusInEvent在元素即将获得焦点时发送。

target:将获得焦点的元素。

relatedTarget:将失去焦点的元素。

模糊事件

BlurEvent在元素失去焦点后发送。

target:失去焦点的元素。

relatedTarget:获得焦点的元素。

焦点事件

FocusEvent在元素获得焦点后发送。

target:获得焦点的元素。

relatedTarget:失去焦点的元素。

例子

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

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

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

  1. 创建一个名为 PlaceHolderExample 的新 C# 脚本。
  2. 将示例代码复制到 C# 脚本中。
  3. 窗口>UI 工具包(Window UI Toolkit) > PlaceHolderExample 下,打开新创建的 编辑器(Editor) 窗口。
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;
        }    
    }
}
布局事件
输入事件