Version: 6000.3
语言: 中文
捕获事件
点击事件

更改事件

当元素的值发生变化时,一个ChangeEvent已发送。这通常在控件字段中的值发生更改时发送。例如,当用户切换复选框时。

ChangeEvent是一个类型化事件,并且包含视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表
.

在更改为视觉元素分配新值后,事件将触发。您无法取消更改事件来阻止视觉元素上的值更改。

的基类ChangeEventEventBase 类。

事件 描述 涓涓细流 气泡升起 可取消
变更事件 元素值更改时发送的通用事件。

独特的属性

previousValue:目标控件的上一个值。

newValue:目标控件的新值。

活动列表

变更事件

ChangeEvent是一个通知事件,允许您对视觉元素的值更改做出反应。例如,当您切换复选框以将游戏中的音乐静音时,游戏应停止所有音乐。

此事件适用于实现INotifyValueChanged<T>哪里<T>ChangeEvent.此事件还在内部用于更新通过绑定链接到 UI 的对象中的属性。

即使控件的值由代码设置,它也会触发。可以修改控件上的值,而无需触发ChangeEvent通过调用SetValueWithoutNotifyINotifyValueChange<T>接口。

您可以注册一个回调函数来接收ChangeEvent以两种方式:

  1. RegisterCallback<>()在视觉元素上
  2. RegisterValueChangedCallback()在派生自INotifyValueChange<T>

通过 RegisterCallback 注册回调适用于所有可视元素,无论它们是否存储内部值。如果要侦听父元素的子控件中发生的任何更改,可以使用此方法。

因为ChangeEvent是类型化事件,则必须在注册事件时指定类型。下面的代码演示了如何注册和接收ChangeEvent的类型bool.

// Registering the callback
rootVisualElement.RegisterCallback<ChangeEvent<bool>>(OnBoolChangedEvent);
// Event callback
private void OnBoolChangedEvent(ChangeEvent<bool> evt) 
{ 
    // Handling code
}

保存值的元素(例如切换和整数字段)实现了INotifyValueChange<T>接口。可以通过调用 RegisterValueChangedCallback 直接在这些元素上注册回调。这是注册回调的更方便的方法,因为该类型已经内置。您可以通过调用myElement.UnregisterValueChangedCallback.

var newToggle = new Toggle("Test Toggle");
newToggle.RegisterValueChangedCallback(OnTestToggleChanged);
private void OnTestToggleChanged(ChangeEvent<bool> evt)
{ 
    // Handling code
}

target:发生状态变化的元素。

例子

以下示例演示了ChangeEvent以及如何设置和获取控制值。

要查看示例,请执行以下作:

  1. 资源>脚本(Assets Scripts) > 编辑器下,创建一个名为 ChangeEventTestWindow 的 C# 脚本。
  2. 将示例代码复制到 C# 脚本中。
  3. 从编辑器工具栏中,选择 窗口(Window) > UI 工具包(UI Toolkit) > 更改事件测试窗口(Change Events Test Window)

示例 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<ChangeEventTestWindow>();
        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<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}");
    }
}

示例 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<ChangeEventTestWindow>().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);
    }
}
捕获事件
点击事件