包含此页的版本:
不含此页的版本:
当元素获得或失去焦点时,就会发生焦点事件。
当需要将焦点更改为焦点或将焦点更改为焦点时,焦点事件非常有用视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表.控件通常使用焦点事件来更改其内容,具体取决于焦点状态。例如,文本字段可以在未焦点时显示占位符文本,也可以对FocusInEvent以清除占位符文本。
焦点可以通过用户交互(例如 Tab 键或单击)或使用 C# 更改视觉元素脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表跟element.Focus().
焦点事件分为两种不同的类型:
FocusOutEvent和FocusInEvent在焦点发生变化之前沿传播路径发送。FocusEvent和BlurEvent在焦点发生变化后立即发送到事件目标。所有焦点事件的基类都是 FocusEventBase。
| 事件 | 描述 | 涓涓细流 | 气泡升起 | 可取消 |
|---|---|---|---|---|
| 焦点活动 | 在元素失去焦点之前发送。 | ✔ | ✔ | |
| 焦点事件 | 在元素获得焦点之前发送。 | ✔ | ✔ | |
| 模糊事件 | 在元素失去焦点后发送。 | ✔ | ||
| 焦点事件 | 在元素获得焦点后发送。 | ✔ |
以下部分介绍焦点事件特有的相关属性。这不是焦点事件系列中所有属性的完整列表。有关完整列表,请参阅 API 文档中的 FocusEventBase。
relatedTarget:包含作为事件次要目标的视觉元素。为FocusOut和Blur事件,它包含获得焦点的元素。为FocusIn和Focus事件,它包含失去焦点的元素。
| 事件 | 目标 | 相关目标 |
|---|---|---|
| 模糊 | 失去焦点的元素。 | 获得焦点的元素。 |
| 重点 | 获得焦点的元素。 | 失去焦点的元素。 |
| focusIn | 获得焦点的元素。 | 失去焦点的元素。 |
| 焦点输出 | 失去焦点的元素。 | 获得焦点的元素。 |
这FocusOutEvent当元素即将失去焦点时发送。
target:将失去焦点的元素。
relatedTarget:将获得焦点的元素。
这FocusInEvent在元素即将获得焦点时发送。
target:将获得焦点的元素。
relatedTarget:将失去焦点的元素。
这BlurEvent在元素失去焦点后发送。
target:失去焦点的元素。
relatedTarget:获得焦点的元素。
这FocusEvent在元素获得焦点后发送。
target:获得焦点的元素。
relatedTarget:失去焦点的元素。
以下示例演示如何在 TextField 中使用占位符文本。
通过UXL创建元素后,脚本会为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;
}
}
}