当元素获得或失去焦点时,会发生焦点事件。
焦点事件在您需要将焦点更改到 视觉元素视觉树的节点,实例化或派生自 C# VisualElement
类。您可以设置外观、定义行为,并将其作为 UI 的一部分显示在屏幕上。 更多信息
参见 词汇表 和从视觉元素中更改焦点时很有用。控件通常使用焦点事件来更改其内容,具体取决于焦点状态。例如,文本字段可以在失去焦点时显示占位符文本,或者它可以响应 FocusInEvent
来清除占位符文本。
视觉元素上的焦点可以通过用户交互(如制表符或单击)或使用 C# 脚本允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以您喜欢的任何方式响应用户输入的代码片段。 更多信息
参见 词汇表 和 element.Focus()
进行更改。
焦点事件分为两种不同的类型
FocusOutEvent
和 FocusInEvent
在焦点发生变化之前沿着传播路径发送。FocusEvent
和 BlurEvent
在焦点发生变化后立即发送到事件目标。所有焦点事件的基类是 FocusEventBase。
事件 | 描述 | 向下传播 | 向上冒泡 | 可取消 |
---|---|---|---|---|
FocusOutEvent | 在元素失去焦点之前发送。 | ✔ | ✔ | |
FocusInEvent | 在元素获得焦点之前发送。 | ✔ | ✔ | |
BlurEvent | 在元素失去焦点后发送。 | ✔ | ||
FocusEvent | 在元素获得焦点后发送。 | ✔ |
以下部分解释了焦点事件特有的相关属性。这不是焦点事件系列中所有属性的完整列表。有关完整列表,请参阅 API 文档中的 FocusEventBase。
relatedTarget
:包含作为事件的次要目标的视觉元素。对于 FocusOut
和 Blur
事件,它包含获得焦点的元素。对于 FocusIn
和 Focus
事件,它包含失去焦点的元素。
事件 | 目标 | relatedTarget |
---|---|---|
模糊 | 失去焦点的元素。 | 获得焦点的元素。 |
焦点 | 获得焦点的元素。 | 失去焦点的元素。 |
focusIn | 获得焦点的元素。 | 失去焦点的元素。 |
focusOut | 失去焦点的元素。 | 获得焦点的元素。 |
当元素即将失去焦点时,会发送 FocusOutEvent
。
target
:即将失去焦点的元素。
relatedTarget
:即将获得焦点的元素。
当元素即将获得焦点时,会发送 FocusInEvent
。
target
:即将获得焦点的元素。
relatedTarget
:即将失去焦点的元素。
在元素失去焦点后,会发送 BlurEvent
。
target
:失去焦点的元素。
relatedTarget
:获得焦点的元素。
在元素获得焦点后,会发送 FocusEvent
。
target
:获得焦点的元素。
relatedTarget
:失去焦点的元素。
以下示例展示了如何在 TextField 中使用占位符文本。
在您通过 UXML 创建元素后,该脚本会将占位符文本分配给 TextField。当 TextField 处于焦点状态时,FocusInEvent
会触发并清除占位符文本。FocusOutEvent
会根据 TextField 内容切换占位符模式。
要查看实际示例,请执行以下操作
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;
}
}
}