Cara menambahkan penanganan aktivitas menggunakan kode (WPF .NET)
Anda dapat menetapkan penanganan aktivitas ke elemen di Windows Presentation Foundation (WPF) menggunakan markup atau code-behind. Meskipun sudah biasa untuk menetapkan penanganan aktivitas dalam Extensible Application Markup Language (XAML), terkadang Anda mungkin harus menetapkan penanganan aktivitas di code-behind. Misalnya, gunakan kode saat:
- Anda menetapkan penanganan aktivitas ke elemen setelah halaman markup yang berisi elemen dimuat.
- Anda menambahkan elemen dan menetapkan penanganan aktivitasnya setelah halaman markup yang akan berisi elemen yang dimuat.
- Anda menentukan pohon elemen untuk aplikasi Anda sepenuhnya dalam kode.
Prasyarat
Artikel ini mengasumsikan pengetahuan dasar tentang peristiwa yang dirutekan, dan anda telah membaca ringkasan peristiwa yang dirutekan. Untuk mengikuti contoh dalam artikel ini, ini membantu jika Anda terbiasa dengan Extensible Application Markup Language (XAML) dan tahu cara menulis aplikasi Windows Presentation Foundation (WPF).
Sintaks untuk penugasan penanganan aktivitas
C# mendukung penugasan penanganan aktivitas menggunakan:
- Operator
+=
, yang juga digunakan dalam model penanganan peristiwa common language runtime (CLR). - Metode UIElement.AddHandler.
VB mendukung penetapan penanganan aktivitas menggunakan:
- Pernyataan AddHandler dengan operator AddressOf , yang juga digunakan dalam model penanganan peristiwa CLR.
- Kata kunci Handles dalam definisi penanganan aktivitas. Untuk informasi selengkapnya, lihat Penanganan peristiwa Visual Basic dan WPF.
- Metode ini UIElement.AddHandler , bersama dengan
AddressOf
operator untuk mereferensikan penanganan aktivitas.
Contoh
Contoh berikut menggunakan XAML untuk menentukan Button bernama dan menetapkan ButtonCreatedByXaml_Click
metode sebagai penanganan aktivitasnya Click ButtonCreatedByXaml
. Click
adalah peristiwa rute bawaan untuk tombol yang berasal dari ButtonBase.
<StackPanel Name="StackPanel1">
<Button
Name="ButtonCreatedByXaml"
Click="ButtonCreatedByXaml_Click"
Content="Create a new button with an event handler"
Background="LightGray">
</Button>
</StackPanel>
Contohnya menggunakan code-behind untuk mengimplementasikan ButtonCreatedByXaml_Click
handler dan ButtonCreatedByCode_Click
, dan untuk menetapkan ButtonCreatedByCode_Click
handler ke ButtonCreatedByCode
elemen dan StackPanel1
. Metode penanganan aktivitas hanya dapat diimplementasikan dalam code-behind.
// The click event handler for the existing button 'ButtonCreatedByXaml'.
private void ButtonCreatedByXaml_Click(object sender, RoutedEventArgs e)
{
// Create a new button.
Button ButtonCreatedByCode = new();
// Specify button properties.
ButtonCreatedByCode.Name = "ButtonCreatedByCode";
ButtonCreatedByCode.Content = "New button and event handler created in code";
ButtonCreatedByCode.Background = Brushes.Yellow;
// Add the new button to the StackPanel.
StackPanel1.Children.Add(ButtonCreatedByCode);
// Assign an event handler to the new button using the '+=' operator.
ButtonCreatedByCode.Click += new RoutedEventHandler(ButtonCreatedByCode_Click);
// Assign an event handler to the new button using the AddHandler method.
// AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click);
// Assign an event handler to the StackPanel using the AddHandler method.
StackPanel1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click));
}
// The Click event handler for the new button 'ButtonCreatedByCode'.
private void ButtonCreatedByCode_Click(object sender, RoutedEventArgs e)
{
string sourceName = ((FrameworkElement)e.Source).Name;
string senderName = ((FrameworkElement)sender).Name;
Debug.WriteLine($"Routed event handler attached to {senderName}, " +
$"triggered by the Click routed event raised by {sourceName}.");
}
' The click event handler for the existing button 'ButtonCreatedByXaml'.
Private Sub ButtonCreatedByXaml_Click(sender As Object, e As RoutedEventArgs)
' Create a new button and specify button properties.
Dim ButtonCreatedByCode As New Button With {
.Name = "ButtonCreatedByCode",
.Content = "New button and event handler created in code",
.Background = Brushes.Yellow
}
' Add the new button to the StackPanel.
StackPanel1.Children.Add(ButtonCreatedByCode)
' Assign an event handler to the new button using the AddHandler statement.
AddHandler ButtonCreatedByCode.Click, AddressOf ButtonCreatedByCode_Click
' Assign an event handler to the new button using the AddHandler method.
' ButtonCreatedByCode.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))
' Assign an event handler to the StackPanel using the AddHandler method.
StackPanel1.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))
End Sub
' The Click event handler for the new button 'ButtonCreatedByCode'.
Private Sub ButtonCreatedByCode_Click(sender As Object, e As RoutedEventArgs)
Dim sourceName As String = CType(e.Source, FrameworkElement).Name
Dim senderName As String = CType(sender, FrameworkElement).Name
Debug.WriteLine($"Routed event handler attached to {senderName}, " +
$"triggered by the Click routed event raised by {sourceName}.")
End Sub
Ketika ButtonCreatedByXaml
diklik dan penanganan aktivitasnya berjalan, ButtonCreatedByXaml_Click
secara terprogram:
- Menambahkan tombol baru bernama
ButtonCreatedByCode
ke pohon elemen XAML yang sudah dibangun. - Menentukan properti untuk tombol baru, seperti nama, konten, dan warna latar belakang.
- Menetapkan penanganan
ButtonCreatedByCode_Click
aktivitas keButtonCreatedByCode
. - Menetapkan penanganan aktivitas yang sama
ButtonCreatedByCode_Click
keStackPanel1
.
Ketika ButtonCreatedByCode
diklik:
- Peristiwa Click yang dirutekan dinaikkan pada
ButtonCreatedByCode
. - Penanganan
ButtonCreatedByCode_Click
aktivitas yang ditetapkan dipicuButtonCreatedByCode
. - Peristiwa
Click
yang dirutekan melintasi pohon elemen keStackPanel1
. - Penanganan
ButtonCreatedByCode_Click
aktivitas yang ditetapkan dipicuStackPanel1
. - Peristiwa
Click
yang dirutekan melanjutkan pohon elemen berpotensi memicu penanganan aktivitas lainClick
yang ditetapkan ke elemen lain yang dilalui.
Penanganan ButtonCreatedByCode_Click
aktivitas mendapatkan informasi berikut tentang peristiwa yang memicunya:
- Objek pengirim , yang merupakan elemen tempat penanganan aktivitas ditetapkan. Akan
sender
menjadiButtonCreatedByCode
pertama kalinya handler berjalan, danStackPanel1
yang kedua kalinya. - Objek RoutedEventArgs.Source , yang merupakan elemen yang awalnya menaikkan peristiwa. Dalam contoh ini,
Source
selaluButtonCreatedByCode
.
Catatan
Perbedaan utama antara peristiwa yang dirutekan dan peristiwa CLR adalah bahwa peristiwa yang dirutekan melintasi pohon elemen, mencari handler, sedangkan peristiwa CLR tidak melintasi pohon elemen dan handler hanya dapat melekat pada objek sumber yang menaikkan peristiwa. Akibatnya, peristiwa sender
yang dirutekan dapat menjadi elemen yang dilalui di pohon elemen.
Untuk informasi selengkapnya tentang cara membuat dan menangani peristiwa yang dirutekan, lihat Cara membuat peristiwa rute kustom dan Menangani peristiwa yang dirutekan.
Lihat juga
.NET Desktop feedback