Основные мероприятия
События фокуса происходят, когда элемент получает или теряет фокус.
События фокуса полезны, когда нужно передавать фокус визуальным элементам и забирать его. Элементы управления часто используют события фокуса, чтобы менять своё содержимое в зависимости от состояния фокуса. Например, текстовое поле может показывать текст-заполнитель, когда оно не в фокусе, или может реагировать на FocusInEvent, чтобы очистить текст замены.
Фокус может изменяться на визуальном элементе в результате взаимодействия пользователя, например, при нажатии клавиши Tab или щелчка, или при использовании скриптов C# с element.Focus().
Основные мероприятия подразделяются на два отдельных типа:
FocusOutEventиFocusInEventотправляются вдоль пути распространения непосредственно перед изменением фокуса.FocusEventиBlurEventотправляются на цель события сразу же после изменения фокуса.
Базовый класс для всех событий фокуса — FocusEventBase.
В нижеследующей таблице описываются события фокуса и фазы их распространения:
| Мероприятие | Описание | Просыпается | Пузырьки вверх | Аннулируемые |
|---|---|---|---|---|
| FocusOutEvent | Отправляется до того, как элемент потеряет фокус. | Да | Да | Нет |
| FocusInEvent | Отправляется до того, как элемент получает фокус. | Да | Да | Нет |
| BlurEvent | Отправляется после того, как элемент потерял фокус. | Да | Нет | Нет |
| FocusEvent | Отправляется после того, как элемент получил фокус. | Да | Нет | Нет |
Уникальные свойства
В следующем разделе объясняются соответствующие свойства, уникальные для событий фокуса. Это не полный список всех свойств в семействе событий фокуса. Полный список см. в FocusEventBase.
relatedTarget: Содержит визуальный элемент, который является вторичным объектом события. Для событий FocusOut и Blur он содержит элемент, который получает фокус. Для событий FocusIn и Focus он содержит элемент, который теряет фокус.
| Мероприятие | Цель | relatedTarget |
|---|---|---|
| Размытие | Элемент, который теряет фокус. | Элемент, который приобретает фокус. |
| Фокус | Элемент, который приобретает фокус. | Элемент, который теряет фокус. |
| focusIn | Элемент, который приобретает фокус. | Элемент, который теряет фокус. |
| focusOut | Элемент, который теряет фокус. | Элемент, который приобретает фокус. |
Список событий
FocusOutEvent
FocusOutEvent отправляется, когда элемент собирается потерять фокус.
target: Элемент, который потеряет фокус.
relatedTarget: Элемент, который получит фокус.
FocusInEvent
FocusInEvent отправляется, когда элемент собирается получить фокус.
target: Элемент, который получит фокус.
relatedTarget: Элемент, который потеряет фокус.
BlurEvent
BlurEvent отправляется после того, как элемент потерял фокус.
target: Элемент, который потерял фокус.
relatedTarget: элемент, который получил фокус.
FocusEvent
FocusEvent отправляется после того, как элемент получает фокус.
target: элемент, который получил фокус.
relatedTarget: Элемент, который потерял фокус.
Примеры
В следующем примере показано, как использовать текст замены в текстовом поле. Когда текстовое поле находится в фокусе, FocusInEvent запускает и очищает текст замены. FocusOutEvent переключает режим замены в зависимости от содержимого текстового поля.
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");
}
// Tracks whether the placeholder text is currently shown.
private bool placeHolderMode = true;
// The placeholder text to display when the field is empty.
private const string placeHolderText = "Write here";
public void CreateGUI()
{
// Create a new TextField and set its value to the placeholder text.
TextField textField = new TextField();
textField.value = placeHolderText;
rootVisualElement.Add(textField);
// Register callbacks for focus in and out events to manage placeholder behavior.
textField.RegisterCallback<FocusInEvent>(OnFocusInTextField);
textField.RegisterCallback<FocusOutEvent>(OnFocusOutTextField);
}
// Called when the TextField receives focus.
private void OnFocusInTextField(FocusInEvent evt)
{
// If the placeholder is active, clear the text so the user can start typing.
if (placeHolderMode)
{
var textField = evt.target as TextField;
if (textField != null)
{
textField.value = "";
}
}
}
// Called when the TextField loses focus.
private void OnFocusOutTextField(FocusOutEvent evt)
{
// If the field is empty after losing focus, restore the placeholder text.
var textField = evt.currentTarget as TextField;
if (textField != null)
{
placeHolderMode = string.IsNullOrEmpty(textField.value);
if (placeHolderMode)
textField.value = placeHolderText;
}
}
}