Bagikan melalui


Gambaran Umum Peristiwa Terlampir

Extensible Application Markup Language (XAML) mendefinisikan komponen bahasa dan jenis peristiwa yang disebut peristiwa terlampir. Konsep peristiwa terlampir memungkinkan Anda menambahkan handler untuk peristiwa tertentu ke elemen arbitrer daripada ke elemen yang benar-benar menentukan atau mewarisi peristiwa. Dalam hal ini, baik objek yang berpotensi menaikkan peristiwa maupun instans penanganan tujuan menentukan atau "memiliki" peristiwa.

Prasyarat

Topik ini mengasumsikan bahwa Anda telah membaca Ringkasan Peristiwa Rute dan XAML di WPF.

Sintaks Peristiwa Terlampir

Peristiwa terlampir memiliki sintaks XAML dan pola pengodean yang harus digunakan oleh kode pendukung untuk mendukung penggunaan peristiwa yang terlampir.

Dalam sintaks XAML, peristiwa terlampir ditentukan bukan hanya dengan nama peristiwanya, tetapi dengan jenis pemiliknya ditambah nama peristiwa, dipisahkan oleh titik (.). Karena nama peristiwa memenuhi syarat dengan nama jenis pemiliknya, sintaks peristiwa yang dilampirkan memungkinkan peristiwa terlampir dilampirkan ke elemen apa pun yang dapat diinstansiasi.

Misalnya, berikut ini adalah sintaks XAML untuk melampirkan handler untuk peristiwa terlampir kustom NeedsCleaning :

<aqua:Aquarium Name="theAquarium" Height="600" Width="800" aqua:AquariumFilter.NeedsCleaning="WashMe"/>

Perhatikan awalan aqua: ; awalan diperlukan dalam hal ini karena peristiwa terlampir adalah peristiwa kustom yang berasal dari xmln yang dipetakan kustom.

Cara WPF Menerapkan Kejadian terlampir

Di WPF, peristiwa terlampir didukung oleh RoutedEvent bidang dan dirutekan melalui pohon setelah dinaikkan. Biasanya, sumber peristiwa terlampir (objek yang menaikkan peristiwa) adalah sistem atau sumber layanan, dan objek yang menjalankan kode yang menaikkan peristiwa karena itu bukan bagian langsung dari pohon elemen.

Skenario untuk Kejadian Terlampir

Di WPF, peristiwa terlampir ada di area fitur tertentu di mana ada abstraksi tingkat layanan, seperti untuk peristiwa yang diaktifkan oleh kelas statis Mouse atau Validation kelas . Kelas yang berinteraksi dengan atau menggunakan layanan dapat menggunakan peristiwa dalam sintaks peristiwa terlampir, atau mereka dapat memilih untuk menampilkan peristiwa terlampir sebagai peristiwa yang dirutekan yang merupakan bagian dari bagaimana kelas mengintegrasikan kemampuan layanan.

Meskipun WPF mendefinisikan sejumlah peristiwa terlampir, skenario di mana Anda akan menggunakan atau menangani peristiwa terlampir secara langsung sangat terbatas. Umumnya, peristiwa terlampir melayani tujuan arsitektur, tetapi kemudian diteruskan ke peristiwa yang tidak terpasang (didukung dengan peristiwa CLR "pembungkus") peristiwa yang dirutekan.

Misalnya, peristiwa Mouse.MouseDown terlampir yang mendasar dapat lebih mudah ditangani pada apa pun yang UIElement diberikan UIElement dengan menggunakannya MouseDown daripada berurusan dengan sintaks peristiwa terlampir baik di XAML atau kode. Peristiwa terlampir melayani tujuan dalam arsitektur karena memungkinkan perluasan perangkat input di masa mendatang. Perangkat hipotetis hanya perlu menaikkan Mouse.MouseDown untuk mensimulasikan input mouse, dan tidak perlu berasal dari Mouse untuk melakukannya. Namun, skenario ini melibatkan penanganan kode peristiwa, dan penanganan XAML dari peristiwa terlampir tidak relevan dengan skenario ini.

Menangani Peristiwa Terlampir di WPF

Proses untuk menangani peristiwa terlampir, dan kode handler yang akan Anda tulis, pada dasarnya sama dengan untuk peristiwa yang dirutekan.

Secara umum, peristiwa terpasang WPF tidak terlalu berbeda dari peristiwa yang dirutekan WPF. Perbedaannya adalah bagaimana peristiwa bersumber dan bagaimana peristiwa diekspos oleh kelas sebagai anggota (yang juga memengaruhi sintaks handler XAML).

Namun, seperti yang disebutkan sebelumnya, peristiwa WPF yang terlampir yang ada tidak terlalu ditujukan untuk penanganan di WPF. Lebih sering, tujuan dari peristiwa ini adalah untuk memungkinkan elemen yang disusupi untuk melaporkan status ke elemen induk dalam menyusun, dalam hal ini peristiwa biasanya dinaikkan dalam kode dan juga bergantung pada penanganan kelas di kelas induk yang relevan. Misalnya, item dalam diharapkan Selector untuk menaikkan peristiwa terlampir Selected , yang kemudian ditangani oleh Selector kelas dan kemudian berpotensi dikonversi oleh Selector kelas menjadi peristiwa rute yang berbeda, SelectionChanged. Untuk informasi selengkapnya tentang peristiwa yang dirutekan dan penanganan kelas, lihat Menandai Peristiwa Rute sebagai Ditangani, dan Penanganan Kelas.

Menentukan Peristiwa Terlampir Anda Sendiri sebagai Peristiwa Yang Dirutekan

Jika Anda berasal dari kelas dasar WPF umum, Anda dapat menerapkan peristiwa terlampir Anda sendiri dengan menyertakan metode pola tertentu di kelas Anda dan dengan menggunakan metode utilitas yang sudah ada di kelas dasar.

Polanya adalah sebagai berikut:

  • Metode TambahkanPenanganan EventNamedengan dua parameter. Parameter pertama adalah instans tempat penanganan aktivitas ditambahkan. Parameter kedua adalah penanganan aktivitas yang akan ditambahkan. Metode harus public dan static, tanpa nilai pengembalian.

  • Metode HapusPenanganan EventNamedengan dua parameter. Parameter pertama adalah instans tempat penanganan aktivitas dihapus. Parameter kedua adalah penanganan aktivitas yang akan dihapus. Metode harus public dan static, tanpa nilai pengembalian.

Metode tambahkanpengakses EventNameHandler memfasilitasi pemrosesan XAML saat atribut penanganan aktivitas yang dilampirkan dideklarasikan pada elemen. Metode TambahkanPenanganan EventNamedan HapusEventNameHandler juga mengaktifkan akses kode ke penyimpanan penanganan aktivitas untuk peristiwa yang dilampirkan.

Pola umum ini belum cukup tepat untuk implementasi praktis dalam kerangka kerja, karena implementasi pembaca XAML tertentu mungkin memiliki skema yang berbeda untuk mengidentifikasi peristiwa yang mendasar dalam bahasa dan arsitektur pendukung. Ini adalah salah satu alasan WPF menerapkan peristiwa terlampir sebagai peristiwa yang dirutekan; pengidentifikasi yang digunakan untuk suatu peristiwa (RoutedEvent) sudah ditentukan oleh sistem peristiwa WPF. Selain itu, perutean peristiwa adalah ekstensi implementasi alami pada konsep tingkat bahasa XAML dari peristiwa yang terlampir.

Implementasi Tambahkan EventNameHandler untuk peristiwa terlampir WPF terdiri dari memanggil AddHandler dengan peristiwa yang dirutekan dan handlersebagai argumen.

Strategi implementasi ini dan sistem peristiwa yang dirutekan secara umum membatasi penanganan untuk peristiwa terlampir ke UIElement kelas turunan atau ContentElement kelas turunan, karena hanya kelas tersebut yang memiliki AddHandler implementasi.

Misalnya, kode berikut mendefinisikan NeedsCleaning peristiwa terlampir pada kelas Aquariumpemilik , menggunakan strategi peristiwa terlampir WPF untuk mendeklarasikan peristiwa terlampir sebagai peristiwa yang dirutekan.

public static readonly RoutedEvent NeedsCleaningEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AquariumFilter));
public static void AddNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}
public static void RemoveNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}
Public Shared ReadOnly NeedsCleaningEvent As RoutedEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(AquariumFilter))
Public Shared Sub AddNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub
Public Shared Sub RemoveNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub

Perhatikan bahwa metode yang digunakan untuk membuat bidang pengidentifikasi peristiwa terlampir, RegisterRoutedEvent, sebenarnya adalah metode yang sama yang digunakan untuk mendaftarkan peristiwa rute yang tidak terpasang. Peristiwa terlampir dan peristiwa yang dirutekan semuanya didaftarkan ke penyimpanan internal terpusat. Implementasi penyimpanan peristiwa ini memungkinkan pertimbangan konseptual "peristiwa sebagai antarmuka" yang dibahas dalam Ringkasan Peristiwa Yang Dirutekan.

Menaikkan Peristiwa terlampir WPF

Anda biasanya tidak perlu menaikkan peristiwa terlampir yang ditentukan WPF yang ada dari kode Anda. Peristiwa ini mengikuti model konseptual "layanan" umum, dan kelas layanan seperti InputManager bertanggung jawab untuk menaikkan peristiwa.

Namun, jika Anda menentukan peristiwa terlampir kustom berdasarkan model WPF dari peristiwa terlampir basing pada RoutedEvent, Anda dapat menggunakan RaiseEvent untuk menaikkan peristiwa terlampir dari salah satu UIElement atau ContentElement. Menaikkan peristiwa yang dirutekan (terlampir atau tidak) mengharuskan Anda mendeklarasikan elemen tertentu di pohon elemen sebagai sumber peristiwa; sumber tersebut dilaporkan sebagai pemanggil RaiseEvent . Menentukan elemen mana yang dilaporkan sebagai sumber di pohon adalah tanggung jawab layanan Anda

Baca juga