При изменении значения элемента отправляется ChangeEvent
. Обычно это отправляется при изменении значения в поле элемента управления. Например, когда пользователь устанавливает флажок.
ChangeEvent
– это типизированное событие, которое содержит как предыдущее, так и новое значение визуального элемента.
Событие запускается после того, как изменение присваивает новое значение визуальному элементу. Вы не можете отменить события изменения, чтобы предотвратить изменение значения визуального элемента.
Базовым классом для ChangeEvent
является класс EventBase.
Событие | Описание | Стекает вниз | Пузыри вверх | Отменяемый |
---|---|---|---|---|
ChangeEvent | Общее событие, отправляемое при изменении значения элемента. | ✔ | ✔ |
Уникальные свойства
previousValue
: предыдущее значение целевого элемента управления.
newValue
: новое значение целевого элемента управления.
Список событий
Событие изменения
ChangeEvent
— это событие уведомления, позволяющее реагировать на изменение значения визуального элемента. Например, когда вы устанавливаете флажок, чтобы отключить музыку в игре, игра должна отключить всю музыку.
Это событие применяется ко всем элементам управления, которые реализуют INotifyValueChanged
, где
— это тип ChangeEvent
. Это событие также используется для внутреннего обновления свойств объектов, связанных с пользовательским интерфейсом через привязки.
Он срабатывает, даже если значение элемента управления установлено кодом. Вы можете изменить значение элемента управления, не запуская ChangeEvent
, вызвав SetValueWithoutNotify
в INotifyValueChange Интерфейс
.
Вы можете зарегистрировать функцию обратного вызова для получения ChangeEvent
двумя способами:
- Вызов
RegisterCallback<>()
для визуального элемента - Вызов
RegisterValueChangedCallback()
для визуального элемента, полученного изINotifyValueChange
Регистрация обратного вызова с помощью RegisterCallback работает со всеми визуальными элементами, независимо от того, хранят ли они внутренние значения или нет. Если вы хотите прослушивать любые изменения, которые происходят в дочерних элементах управления родительского элемента, используйте этот метод.
Поскольку ChangeEvent
является типизированным событием, вы должны указать тип при регистрации события. Код ниже демонстрирует регистрацию и получение ChangeEvent
типа bool
.
// Registering the callback
rootVisualElement.RegisterCallback>(OnBoolChangedEvent);
// Event callback
private void OnBoolChangedEvent(ChangeEvent evt)
{
// Handling code
}
Элементы, содержащие значения, такие как переключатели и целочисленные поля, реализуют интерфейс INotifyValueChange
. Можно зарегистрировать обратный вызов для этих элементов напрямую, вызвав RegisterValueChangedCallback. Это более удобный способ регистрации обратного вызова, поскольку тип уже встроен. Вы можете снова отменить регистрацию обработчиков событий, вызвав myElement.UnregisterValueChangedCallback
.
var newToggle = new Toggle("Test Toggle");
newToggle.RegisterValueChangedCallback(OnTestToggleChanged);
private void OnTestToggleChanged(ChangeEvent evt)
{
// Handling code
}
target
: элемент, в котором происходит изменение состояния.
Примеры
Следующие примеры демонстрируют использование ChangeEvent
, а также способы установки и получения управляющего значения.
Чтобы просмотреть пример, выполните следующие действия:
- В разделе Ресурсы > Сценарии > Редактор создайте сценарий C# с именем ChangeEventTestWindow.
- Скопируйте пример кода в сценарий C#.
- На панели инструментов редактора выберите Окно > Инструментарий пользовательского интерфейса > Изменение окна тестирования событий.
Пример 1. Регистрация обратных вызовов для событий получения изменений
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class ChangeEventTestWindow : EditorWindow
{
private Toggle m_MyToggle;
[MenuItem("Window/UI Toolkit/Change Event Test Window")]
public static void ShowExample()
{
ChangeEventTestWindow wnd = GetWindow();
wnd.titleContent = new GUIContent("Change Event Test Window");
}
public void CreateGUI()
{
// Create a toggle
m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
rootVisualElement.Add(m_MyToggle);
// Register a callback on the toggle
m_MyToggle.RegisterValueChangedCallback(OnTestToggleChanged);
// Register a callback on the parent
rootVisualElement.RegisterCallback>(OnBoolChangedEvent);
}
private void OnBoolChangedEvent(ChangeEvent evt)
{
Debug.Log($"Toggle changed. Old value: {evt.previousValue}, new value: {evt.newValue}");
}
private void OnTestToggleChanged(ChangeEvent evt)
{
Debug.Log($"A bool value changed. Old value: {evt.previousValue}, new value: {evt.newValue}");
}
}
Пример 2. Установка управляющего значения с помощью кода
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class ChangeEventTestWindow : EditorWindow
{
private Toggle m_MyToggle;
[MenuItem("Window/UI Toolkit/Change Event Test Window")]
public static void ShowExample()
{
GetWindow().titleContent = new GUIContent("Change Event Test Window");
}
public void CreateGUI()
{
// Create a toggle and register callback
m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
m_MyToggle.RegisterValueChangedCallback((evt) => { Debug.Log("Change Event received"); });
rootVisualElement.Add(m_MyToggle);
// Create button to toggle the toggle's value
Button button01 = new Button() { text = "Toggle" };
button01.clicked += () =>
{
m_MyToggle.value = !m_MyToggle.value;
};
rootVisualElement.Add(button01);
// Create button to toggle the toggle's value without triggering a ChangeEvent
Button button02 = new Button() { text = "Toggle without notification" };
button02.clicked += () =>
{
m_MyToggle.SetValueWithoutNotify(!m_MyToggle.value);
};
rootVisualElement.Add(button02);
}
}