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. | ✔ | ✔ |
previousValue
: Nilai sebelumnya dari kontrol target.
newValue
: Nilai baru dari kontrol target.
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:
RegisterCallback<>()
pada elemen visualRegisterValueChangedCallback()
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.
Contoh berikut menunjukkan penggunaan ChangeEvent
dan cara mengatur dan mendapatkan nilai kontrol.
Untuk melihat contoh, lakukan berikut:
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}");
}
}
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);
}
}