Kalender
Klik acara

Perubahan peristiwa

Ketika nilai perubahan elemen, ChangeEvent dikirim. Ini biasanya dikirim ketika nilai dalam bidang perubahan kontrol. Misalnya, ketika pengguna beralih kotak centang.

ChangeEvent adalah acara yang diketik, dan mengandung nilai sebelumnya dan baru dari elemen visual.

Acara memicu setelah perubahan menetapkan nilai baru ke elemen visual. Anda tidak dapat membatalkan perubahan acara untuk mencegah perubahan nilai pada elemen visual.

Kelas dasar untuk ChangeEvent adalah kelas EventBase.

Event Description Trickles down Bubbles up Cancellable
ChangeEvent Acara generik yang dikirim ketika nilai perubahan elemen.

Sifat unik

previousValue: Nilai sebelumnya dari kontrol target.

newValue: Nilai baru dari kontrol target.

Daftar Acara

ChangeEvent

ChangeEvent adalah peristiwa notifikasi yang memungkinkan Anda untuk bereaksi terhadap perubahan nilai elemen visual. Sebagai contoh, ketika Anda beralih kotak centang musik dalam permainan, permainan harus menghentikan semua musik.

Acara ini berlaku untuk semua kontrol yang menerapkan INotifyValueChanged<T>, di mana <T> adalah jenis ChangeEvent. Acara ini juga digunakan secara internal untuk memperbarui properti dalam objek yang terkait dengan UI melalui Bindings.

Kebakaran bahkan ketika nilai kontrol ditetapkan oleh kode. Anda dapat memodifikasi nilai pada kontrol tanpa menembakkan ChangeEvent dengan memanggil SetValueWithoutNotify dalam antarmuka INotifyValueChange<T>.

Anda dapat mendaftarkan fungsi callback untuk menerima ChangeEvent dalam dua cara:

  1. Call RegisterCallback<>() pada elemen visual
  2. Call RegisterValueChangedCallback() pada elemen visual yang berasal dari INotifyValueChange<T>

Mendaftar panggilan melalui RegisterCallback bekerja pada semua elemen visual, terlepas dari apakah mereka menyimpan nilai internal atau tidak. Jika Anda ingin mendengarkan setiap perubahan yang terjadi pada kontrol anak elemen induk, ini adalah metode untuk digunakan.

Karena ChangeEvent adalah acara yang diketik, Anda harus menentukan jenis saat mendaftarkan acara. Kode di bawah ini menunjukkan register dan menerima ChangeEvent tipe bool.

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

Elemen yang memegang nilai, seperti toggles dan bidang integer, menerapkan antarmuka INotifyValueChange<T>. Mungkin untuk mendaftarkan panggilan pada elemen-elemen ini langsung, dengan memanggil RegisterValueChangedCallback. Ini adalah cara yang lebih nyaman untuk mendaftarkan callback karena jenisnya sudah dibangun. Anda dapat menangani acara yang tidak terdaftar lagi dengan memanggil myElement.UnregisterValueChangedCallback.

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

target: Elemen di mana perubahan keadaan terjadi.

Examples

Contoh berikut menunjukkan penggunaan ChangeEvent dan cara mengatur dan mendapatkan nilai kontrol.

Untuk melihat contoh, lakukan berikut:

  1. Di bawah Assets > Scripts > Editor, buat skrip C# yang disebut ChangeEventTestWindow.
  2. Salin kode contoh ke dalam skrip C#.
  3. Dari Editor Toolbar, pilih Window > UI Toolkit > Change Events Test Window

Contoh 1: Mendaftarkan panggilan ke peristiwa perubahan menerima

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}");
    }
}

Contoh 2: Mengatur nilai kontrol melalui kode

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);
    }
}
Kalender
Klik acara