当某个元素值更改时,发送 ChangeEvent
事件。通常在控件的字段值发生更改时发送。例如,当用户切换复选框时。
ChangeEvent
是一个类型化事件,包含视觉元素的前一个值和新值。
该事件在更改行为将新值指定给视觉元素后触发。您不能通过取消更改事件来阻止视觉元素上的值更改。
ChangeEvent
的基类是 EventBase 类。
事件 | 描述 | 涓滴 | 冒泡 | 可取消 |
---|---|---|---|---|
ChangeEvent | 当某个元素的值更改时发送的通用事件。 | ✔ | ✔ |
previousValue
:目标控件的先前值。
newValue
:目标控件的新值。
ChangeEvent
是一个通知事件,允许您对视觉元素的值变化做出反应。例如,当您在游戏中切换复选框以将音乐静音时,游戏应停止所有音乐。
此事件适用于所有实现 INotifyValueChanged<T>
,其中 <T>
是 ChangeEvent
的类型。此事件也内部用于对通过绑定链接到 UI 的对象内属性进行更新。
即使控件的值是由代码设置的,它也会触发。您可以通过调用 INotifyValueChange<T>
接口中的 SetValueWithoutNotify
在不触发 ChangeEvent
的情况下修改控件上的值。
您可以通过两种方式注册回调函数以接收 ChangeEvent
:
RegisterCallback<>()
on a visual elementINotifyValueChange<T>
的视觉元素上调用 RegisterValueChangedCallback()
通过 RegisterCallback 注册回调适用于所有视觉元素,无论它们是否存储内部值。如果您想监听父元素的子控件中发生的任何更改,则可以使用此方法。
因为 ChangeEvent
是一个类型化事件,所以在注册事件时必须指定类型。下面的代码演示了注册和接收类型为 bool
的 ChangeEvent
。
// 注册回调
rootVisualElement.RegisterCallback<ChangeEvent<bool>>(OnBoolChangedEvent);
//事件回调
private void OnBoolChangedEvent(ChangeEvent<bool> evt)
{
// 处理代码
}
保存值的元素(如开关和整数字段)实现了 INotifyValueChange<T>
接口。可以通过调用 RegisterValueChangedCallback 直接在这些元素上注册回调。这是一种更方便的注册回调的方法,因为类型已经内置。您可以通过调用 myElement.UnregisterValueChangedCallback
取消注册事件处理程序。
var newToggle = new Toggle("Test Toggle");
newToggle.RegisterValueChangedCallback(OnTestToggleChanged);
private void OnTestToggleChanged(ChangeEvent<bool> evt)
{
// 处理代码
}
target
:发生状态变化的元素。
以下示例演示了 ChangeEvent
的用法以及如何设置和获取控件值。
要查看示例,请执行以下操作:
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<ChangeEventTestWindow>();
wnd.titleContent = new GUIContent("Change Event Test Window");
}
public void CreateGUI()
{
// 创建一个开关
m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
rootVisualElement.Add(m_MyToggle);
// 在开关上注册回调
m_MyToggle.RegisterValueChangedCallback(OnTestToggleChanged);
// 在父级上注册回调
rootVisualElement.RegisterCallback<ChangeEvent<bool>>(OnBoolChangedEvent);
}
private void OnBoolChangedEvent(ChangeEvent<bool> evt)
{
Debug.Log($"Toggle changed.Old value: {evt.previousValue}, new value: {evt.newValue}");
}
private void OnTestToggleChanged(ChangeEvent<bool> evt)
{
Debug.Log($"A bool value changed.Old value: {evt.previousValue}, new value: {evt.newValue}");
}
}
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<ChangeEventTestWindow>().titleContent = new GUIContent("Change Event Test Window");
}
public void CreateGUI()
{
// 创建开关和注册回调
m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
m_MyToggle.RegisterValueChangedCallback((evt) => { Debug.Log("Change Event received"); });
rootVisualElement.Add(m_MyToggle);
// 创建按钮来切换开关的值
Button button01 = new Button() { text = "Toggle" };
button01.clicked += () =>
{
m_MyToggle.value = !m_MyToggle.value;
};
rootVisualElement.Add(button01);
// 创建按钮以在不触发 ChangeEvent 的情况下切换开关的值
Button button02 = new Button() { text = "Toggle without notification" };
button02.clicked += () =>
{
m_MyToggle.SetValueWithoutNotify(!m_MyToggle.value);
};
rootVisualElement.Add(button02);
}
}
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.