Bagikan melalui


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:

  1. Menambahkan tombol baru bernama ButtonCreatedByCode ke pohon elemen XAML yang sudah dibangun.
  2. Menentukan properti untuk tombol baru, seperti nama, konten, dan warna latar belakang.
  3. Menetapkan penanganan ButtonCreatedByCode_Click aktivitas ke ButtonCreatedByCode.
  4. Menetapkan penanganan aktivitas yang sama ButtonCreatedByCode_Click ke StackPanel1.

Ketika ButtonCreatedByCode diklik:

  1. Peristiwa Click yang dirutekan dinaikkan pada ButtonCreatedByCode.
  2. Penanganan ButtonCreatedByCode_Click aktivitas yang ditetapkan dipicu ButtonCreatedByCode .
  3. Peristiwa Click yang dirutekan melintasi pohon elemen ke StackPanel1.
  4. Penanganan ButtonCreatedByCode_Click aktivitas yang ditetapkan dipicu StackPanel1 .
  5. Peristiwa Click yang dirutekan melanjutkan pohon elemen berpotensi memicu penanganan aktivitas lain Click 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 menjadi ButtonCreatedByCode pertama kalinya handler berjalan, dan StackPanel1 yang kedua kalinya.
  • Objek RoutedEventArgs.Source , yang merupakan elemen yang awalnya menaikkan peristiwa. Dalam contoh ini, Source selalu ButtonCreatedByCode.

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