События фокуса происходят, когда элемент получает или теряет фокус.
События фокусировки полезны, когда вам нужно переключить фокус с визуальных элементов на другие. Элементы управления часто используют события фокуса для изменения своего содержимого в зависимости от состояния фокуса. Например, текстовое поле может отображать замещающий текст, когда оно не находится в фокусе, или оно может реагировать на FocusInEvent
и очищать замещающий текст.
Фокус может переключаться на визуальный элемент в зависимости от действий пользователя, таких как нажатие табуляции или нажатие, или с помощью скриптов C#Часть код, который позволяет вам создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на ввод данных пользователем любым удобным для вас способом. Подробнее
См. в Словарь с element.Focus( )
.
События фокуса делятся на два разных типа:
FocusOutEvent
иFocusInEvent
отправляются по пути распространения непосредственно перед изменением фокуса.FocusEvent
иBlurEvent
отправляются в цель события сразу после изменения фокуса.
Базовым классом для всех событий фокуса является FocusEventBase.
Событие | Описание | Стекает вниз | Пузыри вверх | Отменяемый |
---|---|---|---|---|
FocusOutEvent | Отправляется до того, как элемент потеряет фокус. | ✔ | ✔ | |
FocusInEvent | Отправляется до того, как элемент получит фокус. | ✔ | ✔ | |
BlurEvent | Отправляется после того, как элемент потерял фокус. | ✔ | ||
FocusEvent | Отправляется после того, как элемент получил фокус. | ✔ |
Уникальные свойства
В следующем разделе объясняются соответствующие свойства, уникальные для событий фокуса. Это не полный список всех свойств в семействе фокусных событий. Полный список см. в разделе FocusEventBase документации по API.
relatedTarget
: содержит визуальный элемент, являющийся вторичной целью события. Для событий FocusOut
и Blur
он содержит элемент, который получает фокус. Для событий FocusIn
и Focus
он содержит элемент, который теряет фокус.
Событие | цель | связанная цель |
---|---|---|
Blur | Элемент, который теряет фокус. | Элемент, который теряет фокус. |
Focus | Элемент, который теряет фокус. | Элемент, который теряет фокус. |
focusIn | Элемент, который теряет фокус. | Элемент, который теряет фокус. |
focusOut | Элемент, который теряет фокус. | Элемент, который теряет фокус. |
Список событий
FocusOutEvent
Событие FocusOutEvent
отправляется, когда элемент вот-вот потеряет фокус.
target
: элемент, который потеряет фокус.
relatedTarget
: элемент, который получит фокус.
FocusInEvent
Событие FocusInEvent
отправляется, когда элемент вот-вот получит фокус.
target
: элемент, который получит фокус.
relatedTarget
: элемент, который потеряет фокус.
Размытие
Событие, отправляемое после того, как элемент теряет фокус.
target
: элемент, потерявший фокус.
relatedTarget
: элемент, получивший фокус.
Событие фокуса
Событие, отправленное после того, как элемент получил фокус.
target
: элемент, получивший фокус.
relatedTarget
: элемент, потерявший фокус.
Примеры
В следующем примере показано, как использовать текст-заполнитель в TextField.
После того как вы создадите элементы с помощью UXML, сценарий присваивает текстовому полю текстовый заполнитель. Когда TextField находится в фокусе, FocusInEvent
срабатывает и очищает текст-заполнитель. FocusOutEvent
переключает режим заполнителя на основе содержимого TextField.
Чтобы увидеть пример в действии, сделайте следующее:
- Создайте новый скрипт C# с именем PlaceHolderExample.
- Скопируйте пример кода в скрипт C#.
- В разделе Окно > UI Toolkit > PlaceHolderExample откройте только что созданное окно редактора.
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class PlaceHolderExample : EditorWindow
{
[MenuItem("Window/UI Toolkit/PlaceHolderExample")]
public static void ShowExample()
{
PlaceHolderExample wnd = GetWindow();
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(OnFocusInTextField);
textField.RegisterCallback(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;
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;
placeHolderMode = string.IsNullOrEmpty(textField.value);
if (placeHolderMode)
textField.value = placeHolderText;
}
}