Gambaran umum peristiwa dan peristiwa yang dirutekan

API penting

Kami menjelaskan konsep pemrograman peristiwa di aplikasi Windows Runtime, saat menggunakan ekstensi komponen C#, Visual Basic, atau Visual C++ (C++/CX) sebagai bahasa pemrograman Anda, dan XAML untuk definisi UI Anda. Anda dapat menetapkan handler untuk peristiwa sebagai bagian dari deklarasi untuk elemen UI di XAML, atau Anda dapat menambahkan handler dalam kode. Windows Runtime mendukung peristiwa yang dirutekan: peristiwa input dan peristiwa data tertentu dapat ditangani oleh objek di luar objek yang menembakkan peristiwa. Peristiwa yang dirutekan berguna saat Anda menentukan templat kontrol, atau menggunakan halaman atau kontainer tata letak.

Peristiwa sebagai konsep pemrograman

Secara umum, konsep peristiwa saat memprogram aplikasi Windows Runtime mirip dengan model peristiwa dalam bahasa pemrograman paling populer. Jika Anda sudah tahu cara bekerja dengan peristiwa Microsoft .NET atau C++, Anda memiliki awalan. Tetapi Anda tidak perlu tahu bahwa banyak tentang konsep model peristiwa untuk melakukan beberapa tugas dasar, seperti melampirkan handler.

Saat Anda menggunakan C#, Visual Basic atau C++/CX sebagai bahasa pemrograman Anda, UI ditentukan dalam markup (XAML). Dalam sintaks markup XAML, beberapa prinsip menghubungkan peristiwa antara elemen markup dan entitas kode runtime mirip dengan teknologi Web lainnya, seperti ASP.NET, atau HTML5.

Perhatikan Kode yang menyediakan logika runtime untuk UI yang ditentukan XAML sering disebut sebagai code-behind atau file code-behind. Dalam tampilan solusi Microsoft Visual Studio, hubungan ini ditampilkan secara grafis, dengan file code-behind menjadi file dependen dan berlapis versus halaman XAML yang dirujuknya.

Tombol.Klik: pengantar peristiwa dan XAML

Salah satu tugas pemrograman yang paling umum untuk aplikasi Windows Runtime adalah menangkap input pengguna ke UI. Misalnya, UI Anda mungkin memiliki tombol yang harus diklik pengguna untuk mengirimkan info atau mengubah status.

Anda menentukan UI untuk aplikasi Windows Runtime Anda dengan membuat XAML. XAML ini biasanya merupakan output dari permukaan desain di Visual Studio. Anda juga dapat menulis XAML di editor teks biasa atau editor XAML pihak ketiga. Saat menghasilkan XAML tersebut, Anda dapat menghubungkan penanganan aktivitas untuk elemen UI individual secara bersamaan yang Anda tentukan semua atribut XAML lainnya yang menetapkan nilai properti dari elemen UI tersebut.

Untuk menyambungkan peristiwa di XAML, Anda menentukan nama bentuk string dari metode handler yang telah Anda tentukan atau akan tentukan nanti di code-behind Anda. Misalnya, XAML ini mendefinisikan objek Tombol dengan properti lain (atribut x:Name, Konten) yang ditetapkan sebagai atribut, dan menghubungkan handler untuk peristiwa Klik tombol dengan merujuk metode bernama :ShowUpdatesButton_Click

<Button x:Name="showUpdatesButton"
  Content="{Binding ShowUpdatesText}"
  Click="ShowUpdatesButton_Click"/>

TipEvent wiring adalah istilah pemrograman. Ini mengacu pada proses atau kode di mana Anda menunjukkan bahwa kemunculan peristiwa harus memanggil metode handler bernama. Dalam sebagian besar model kode prosedural, kabel peristiwa adalah kode "AddHandler" implisit atau eksplisit yang menamai peristiwa dan metode, dan biasanya melibatkan instans objek target. Di XAML, "AddHandler" bersifat implisit, dan kabel peristiwa sepenuhnya terdiri dari penamaan peristiwa sebagai nama atribut elemen objek, dan menamai handler sebagai nilai atribut tersebut.

Anda menulis handler aktual dalam bahasa pemrograman yang Anda gunakan untuk semua kode dan kode aplikasi Anda di belakang. Dengan atribut Click="ShowUpdatesButton_Click", Anda telah membuat kontrak bahwa ketika XAML dikompilasi dan diurai markup, baik langkah kompilasi markup XAML dalam tindakan build IDE Anda dan penguraian XAML akhirnya ketika aplikasi dimuat dapat menemukan metode bernama ShowUpdatesButton_Click sebagai bagian dari kode aplikasi. ShowUpdatesButton_Clickharus merupakan metode yang mengimplementasikan tanda tangan metode yang kompatibel (berdasarkan delegasi) untuk penanganan peristiwa Klik. Misalnya, kode ini mendefinisikan ShowUpdatesButton_Click handler.

private void ShowUpdatesButton_Click (object sender, RoutedEventArgs e) 
{
    Button b = sender as Button;
    //more logic to do here...
}
Private Sub ShowUpdatesButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim b As Button = CType(sender, Button)
    '  more logic to do here...
End Sub
void winrt::MyNamespace::implementation::BlankPage::ShowUpdatesButton_Click(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& e)
{
    auto b{ sender.as<Windows::UI::Xaml::Controls::Button>() };
    // More logic to do here.
}
void MyNamespace::BlankPage::ShowUpdatesButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{
    Button^ b = (Button^) sender;
    //more logic to do here...
}

Dalam contoh ini, ShowUpdatesButton_Click metode didasarkan pada delegasi RoutedEventHandler . Anda akan tahu bahwa ini adalah delegasi yang akan digunakan karena Anda akan melihat delegasi yang dinamai dalam sintaks untuk metode Klik.

Tip Visual Studio menyediakan cara mudah untuk memberi nama penanganan aktivitas dan menentukan metode handler saat Anda mengedit XAML. Saat Anda memberikan nama atribut peristiwa di editor teks XAML, tunggu sebentar hingga daftar Microsoft IntelliSense ditampilkan. Jika Anda mengklik <Penanganan> Aktivitas Baru dari daftar, Microsoft Visual Studio akan menyarankan nama metode berdasarkan elemen x:Name (atau nama jenis), nama peristiwa, dan akhiran numerik. Anda kemudian dapat mengklik kanan nama penanganan aktivitas yang dipilih dan klik Navigasi ke Penanganan Aktivitas. Ini akan menavigasi langsung ke definisi penanganan aktivitas yang baru disisipkan, seperti yang terlihat dalam tampilan editor kode file code-behind Anda untuk halaman XAML. Penanganan aktivitas sudah memiliki tanda tangan yang benar, termasuk parameter pengirim dan kelas data peristiwa yang digunakan peristiwa. Selain itu, jika metode handler dengan tanda tangan yang benar sudah ada di code-behind Anda, nama metode tersebut muncul di drop-down lengkapi otomatis bersama dengan <opsi Penanganan> Aktivitas Baru. Anda juga dapat menekan tombol Tab sebagai pintasan alih-alih mengklik item daftar IntelliSense.

Menentukan penanganan aktivitas

Untuk objek yang merupakan elemen UI dan dideklarasikan dalam XAML, kode penanganan aktivitas didefinisikan dalam kelas parsial yang berfungsi sebagai kode di belakang untuk halaman XAML. Penanganan aktivitas adalah metode yang Anda tulis sebagai bagian dari kelas parsial yang terkait dengan XAML Anda. Penanganan aktivitas ini didasarkan pada delegasi yang digunakan peristiwa tertentu. Metode penanganan aktivitas Anda dapat bersifat publik atau privat. Akses privat berfungsi karena handler dan instans yang dibuat oleh XAML pada akhirnya digabungkan dengan pembuatan kode. Secara umum, kami sarankan Anda membuat metode penanganan aktivitas Anda privat di kelas .

Catatan Penanganan aktivitas untuk C++ tidak didefinisikan dalam kelas parsial, mereka dinyatakan di header sebagai anggota kelas privat. Tindakan build untuk proyek C++ mengurus pembuatan kode yang mendukung sistem jenis XAML dan model code-behind untuk C++.

Parameter pengirim dan data peristiwa

Handler yang Anda tulis untuk peristiwa dapat mengakses dua nilai yang tersedia sebagai input untuk setiap kasus di mana handler Anda dipanggil. Nilai pertama tersebut adalah pengirim, yang merupakan referensi ke objek tempat handler dilampirkan. Parameter pengirim ditik sebagai jenis Objek dasar. Teknik umumnya adalah melemparkan pengirim ke jenis yang lebih tepat. Teknik ini berguna jika Anda berharap untuk memeriksa atau mengubah status pada objek pengirim itu sendiri. Berdasarkan desain aplikasi Anda sendiri, Anda biasanya tahu jenis yang aman untuk ditransmisikan pengirim , berdasarkan tempat handler dilampirkan atau spesifik desain lainnya.

Nilai kedua adalah data peristiwa, yang umumnya muncul dalam definisi sintaks sebagai parameter e . Anda dapat menemukan properti mana untuk data peristiwa yang tersedia dengan melihat parameter e delegasi yang ditetapkan untuk peristiwa tertentu yang Anda tangani, lalu menggunakan IntelliSense atau Browser Objek di Visual Studio. Atau Anda dapat menggunakan dokumentasi referensi Windows Runtime.

Untuk beberapa peristiwa, nilai properti khusus data peristiwa sama pentingnya dengan mengetahui bahwa peristiwa terjadi. Ini terutama berlaku untuk peristiwa input. Untuk peristiwa penunjuk, posisi pointer saat peristiwa terjadi mungkin penting. Untuk peristiwa keyboard, semua tombol yang mungkin menekan aktifkan peristiwa KeyDown dan KeyUp. Untuk menentukan kunci mana yang ditekan pengguna, Anda harus mengakses KeyRoutedEventArgs yang tersedia untuk penanganan aktivitas. Untuk informasi selengkapnya tentang menangani peristiwa input, lihat Interaksi keyboard dan Menangani input penunjuk. Peristiwa input dan skenario input sering memiliki pertimbangan tambahan yang tidak tercakup dalam topik ini, seperti pengambilan pointer untuk peristiwa pointer, dan tombol pengubah dan kode kunci platform untuk peristiwa keyboard.

Penanganan aktivitas yang menggunakan pola asinkron

Dalam beberapa kasus, Anda mungkin ingin menggunakan API yang menggunakan pola asinkron dalam penanganan aktivitas. Misalnya, Anda dapat menggunakan Tombol di AppBar untuk menampilkan pemilih file dan berinteraksi dengannya. Namun, banyak API pemilih file tidak sinkron. Mereka harus dipanggil dalam cakupan asinkron/dapat ditunggu, dan pengkompilasi akan memberlakukan ini. Jadi apa yang dapat Anda lakukan adalah menambahkan kata kunci asinkron ke penanganan aktivitas Anda sehingga handler sekarang batal asinkron. Sekarang penanganan aktivitas Anda diizinkan untuk melakukan panggilan asinkron/dapat ditunggu.

Untuk contoh penanganan peristiwa interaksi pengguna menggunakan pola asinkron, lihat Akses file dan pemilih (bagiandari Buat aplikasi Windows Runtime pertama Anda menggunakan seri C# atau Visual Basic). Lihat juga [Panggil API asinkron di C).

Menambahkan penanganan aktivitas dalam kode

XAML bukan satu-satunya cara untuk menetapkan penanganan aktivitas ke objek. Untuk menambahkan penanganan aktivitas ke objek tertentu dalam kode, termasuk ke objek yang tidak dapat digunakan di XAML, Anda dapat menggunakan sintaksis khusus bahasa untuk menambahkan penanganan aktivitas.

Dalam C#, sintaksnya adalah menggunakan += operator. Anda mendaftarkan handler dengan mereferensikan nama metode penanganan aktivitas di sisi kanan operator.

Jika Anda menggunakan kode untuk menambahkan penanganan aktivitas ke objek yang muncul di UI run-time, praktik umumnya adalah menambahkan penangan tersebut sebagai respons terhadap peristiwa seumur hidup objek atau panggilan balik, seperti Dimuat atau OnApplyTemplate, sehingga penanganan aktivitas pada objek yang relevan siap untuk peristiwa yang dimulai pengguna pada waktu proses. Contoh ini memperlihatkan kerangka XAML dari struktur halaman lalu menyediakan sintaks bahasa C# untuk menambahkan penanganan aktivitas ke objek.

<Grid x:Name="LayoutRoot" Loaded="LayoutRoot_Loaded">
  <StackPanel>
    <TextBlock Name="textBlock1">Put the pointer over this text</TextBlock>
...
  </StackPanel>
</Grid>
void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
    textBlock1.PointerEntered += textBlock1_PointerEntered;
    textBlock1.PointerExited += textBlock1_PointerExited;
}

Catatan Sintaks yang lebih verbose ada. Pada tahun 2005, C# menambahkan fitur yang disebut inferensi delegasi, yang memungkinkan kompilator menyimpulkan instans delegasi baru dan mengaktifkan sintaks sebelumnya yang lebih sederhana. Sintaks verbose secara fungsional identik dengan contoh sebelumnya, tetapi secara eksplisit membuat instans delegasi baru sebelum mendaftarkannya, sehingga tidak memanfaatkan inferensi delegasi. Sintaksis eksplisit ini kurang umum, tetapi Anda mungkin masih melihatnya dalam beberapa contoh kode.

void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
    textBlock1.PointerEntered += new PointerEventHandler(textBlock1_PointerEntered);
    textBlock1.PointerExited += new MouseEventHandler(textBlock1_PointerExited);
}

Ada dua kemungkinan untuk sintaks Visual Basic. Salah satunya adalah dengan menyejajarkan sintaks C# dan melampirkan handler langsung ke instans. Ini memerlukan kata kunci AddHandler dan juga operator AddressOf yang mendereferensikan nama metode handler.

Opsi lain untuk sintaks Visual Basic adalah menggunakan kata kunci Handles pada penanganan aktivitas. Teknik ini sesuai untuk kasus di mana handler diharapkan ada pada objek pada waktu pemuatan dan bertahan selama masa pakai objek. Menggunakan Handel pada objek yang ditentukan dalam XAML mengharuskan Anda memberikan Nama / x:Name. Nama ini menjadi kualifikasi instans yang diperlukan untuk bagian Instance.Event dari sintaks Handles . Dalam hal ini, Anda tidak memerlukan penanganan aktivitas berbasis masa pakai objek untuk memulai melampirkan penanganan aktivitas lainnya; koneksi Handles dibuat saat Anda mengkompilasi halaman XAML Anda.

Private Sub textBlock1_PointerEntered(ByVal sender As Object, ByVal e As PointerRoutedEventArgs) Handles textBlock1.PointerEntered
' ...
End Sub

Perhatikan Visual Studio dan permukaan desain XAML-nya umumnya mempromosikan teknik penanganan instans alih-alih kata kunci Handles . Ini karena membangun kabel penanganan aktivitas di XAML adalah bagian dari alur kerja perancang-pengembang yang khas, dan teknik kata kunci Handles tidak kompatibel dengan pengabelan penanganan aktivitas di XAML.

Di C++/CX, Anda juga menggunakan += sintaks, tetapi ada perbedaan dari formulir C# dasar:

  • Tidak ada inferensi delegasi, jadi Anda harus menggunakan ref baru untuk instans delegasi.
  • Konstruktor delegasi memiliki dua parameter, dan memerlukan objek target sebagai parameter pertama. Biasanya Anda menentukan ini.
  • Konstruktor delegasi memerlukan alamat metode sebagai parameter kedua, sehingga operator referensi & mendahului nama metode.
textBlock1().PointerEntered({this, &MainPage::TextBlock1_PointerEntered });
textBlock1->PointerEntered += 
ref new PointerEventHandler(this, &BlankPage::textBlock1_PointerEntered);

Menghapus penanganan aktivitas dalam kode

Biasanya tidak perlu menghapus penanganan aktivitas dalam kode, bahkan jika Anda menambahkannya dalam kode. Perilaku seumur hidup objek untuk sebagian besar objek Windows Runtime seperti halaman dan kontrol akan menghancurkan objek ketika terputus dari Jendela utama dan pohon visualnya, dan referensi delegasi apa pun juga dihancurkan. .NET melakukan ini melalui pengumpulan sampah dan Windows Runtime dengan C++/CX menggunakan referensi yang lemah secara default.

Ada beberapa kasus langka di mana Anda ingin menghapus penanganan aktivitas secara eksplisit. Ini termasuk:

  • Penangan yang Anda tambahkan untuk peristiwa statis, yang tidak dapat dikumpulkan sampah dengan cara konvensional. Contoh peristiwa statis di Windows Runtime API adalah peristiwa kelas CompositionTarget dan Clipboard.
  • Uji kode di mana Anda ingin waktu penghapusan handler segera, atau kode di mana Anda harus menukar penanganan aktivitas lama/baru untuk peristiwa pada waktu proses.
  • Implementasi aksesor penghapusan kustom.
  • Peristiwa statis kustom.
  • Handler untuk navigasi halaman.

FrameworkElement.Unloaded atau Page.NavigatedFrom adalah kemungkinan pemicu peristiwa yang memiliki posisi yang sesuai dalam manajemen status dan masa pakai objek sehingga Anda dapat menggunakannya untuk menghapus handler untuk peristiwa lain.

Misalnya, Anda dapat menghapus penanganan aktivitas bernama textBlock1_PointerEntered dari objek target textBlock1 menggunakan kode ini.

textBlock1.PointerEntered -= textBlock1_PointerEntered;
RemoveHandler textBlock1.PointerEntered, AddressOf textBlock1_PointerEntered

Anda juga dapat menghapus handler untuk kasus di mana peristiwa ditambahkan melalui atribut XAML, yang berarti bahwa handler ditambahkan dalam kode yang dihasilkan. Ini lebih mudah dilakukan jika Anda memberikan nilai Nama untuk elemen tempat handler dilampirkan, karena itu menyediakan referensi objek untuk kode nanti; namun, Anda juga dapat memandu pohon objek untuk menemukan referensi objek yang diperlukan jika objek tidak memiliki Nama.

Jika Anda perlu menghapus penanganan aktivitas di C++/CX, Anda memerlukan token pendaftaran, yang seharusnya Anda terima dari nilai += pengembalian pendaftaran penanganan aktivitas. Itu karena nilai yang Anda gunakan untuk sisi -= kanan deregistrasi dalam sintaks C++/CX adalah token, bukan nama metode. Untuk C++/CX, Anda tidak dapat menghapus handler yang ditambahkan sebagai atribut XAML karena kode yang dihasilkan C++/CX tidak menyimpan token.

Peristiwa yang dirutekan

Windows Runtime dengan C#, Microsoft Visual Basic atau C++/CX mendukung konsep peristiwa yang dirutekan untuk serangkaian peristiwa yang ada di sebagian besar elemen UI. Peristiwa ini untuk skenario interaksi input dan pengguna, dan diimplementasikan pada kelas dasar UIElement. Berikut adalah daftar peristiwa input yang merupakan peristiwa yang dirutekan:

Peristiwa yang dirutekan adalah peristiwa yang berpotensi diteruskan (dirutekan) dari objek anak ke masing-masing objek induk berturut-turut di pohon objek. Struktur XAML UI Anda mempertanyakan pohon ini, dengan akar pohon tersebut menjadi elemen akar di XAML. Pohon objek benar mungkin agak bervariasi dari elemen XAML bersarang, karena pohon objek tidak menyertakan fitur bahasa XAML seperti tag elemen properti. Anda dapat menyimpulkan peristiwa yang dirutekan sebagai gelembung dari elemen objek XAML elemen turunan yang menembakkan peristiwa, ke arah elemen objek induk yang berisinya. Peristiwa dan data peristiwanya dapat ditangani pada beberapa objek di sepanjang rute peristiwa. Jika tidak ada elemen yang memiliki handler, rute berpotensi terus berjalan sampai elemen root tercapai.

Jika Anda mengetahui teknologi Web seperti Dynamic HTML (DHTML) atau HTML5, Anda mungkin sudah terbiasa dengan konsep peristiwa yang menggelegak .

Saat peristiwa yang dirutekan menggelegak melalui rute peristiwanya, semua penanganan peristiwa yang terpasang semuanya mengakses instans bersama data peristiwa. Oleh karena itu, jika salah satu data peristiwa dapat ditulis oleh handler, setiap perubahan yang dilakukan pada data peristiwa akan diteruskan ke handler berikutnya, dan mungkin tidak lagi mewakili data peristiwa asli dari peristiwa. Ketika suatu peristiwa memiliki perilaku peristiwa yang dirutekan, dokumentasi referensi akan menyertakan komentar atau notasi lain tentang perilaku yang dirutekan.

Properti OriginalSource dari RoutedEventArgs

Saat peristiwa menggelembungkan rute peristiwa, pengirim tidak lagi menjadi objek yang sama dengan objek penggalangan peristiwa. Sebaliknya, pengirim adalah objek tempat handler yang sedang dipanggil dilampirkan.

Dalam beberapa kasus, pengirim tidak menarik, dan Anda malah tertarik pada info seperti objek turunan mana yang mungkin penunjuk berakhir ketika peristiwa pointer diaktifkan, atau objek mana dalam UI yang lebih besar yang memegang fokus saat pengguna menekan tombol keyboard. Untuk kasus ini, Anda dapat menggunakan nilai properti OriginalSource. Di semua titik pada rute, OriginalSource melaporkan objek asli yang menembakkan peristiwa, bukan objek tempat handler dilampirkan. Namun, untuk peristiwa input UIElement , objek asli tersebut sering kali merupakan objek yang tidak segera terlihat dalam definisi UI tingkat halaman XAML. Sebagai gantinya, objek sumber asli tersebut mungkin merupakan bagian dari kontrol yang di-template. Misalnya, jika pengguna mengarahkan penunjuk ke tepi tombol, untuk sebagian besar peristiwa pointer, OriginalSource adalah bagian templat Batas dalam Templat, bukan Tombol itu sendiri.

Gelembung peristiwa Input Tip sangat berguna jika Anda membuat kontrol templat. Kontrol apa pun yang memiliki templat dapat memiliki templat baru yang diterapkan oleh konsumennya. Konsumen yang mencoba membuat ulang templat yang berfungsi mungkin secara tidak sengaja menghilangkan beberapa penanganan peristiwa yang dideklarasikan dalam templat default. Anda masih dapat memberikan penanganan peristiwa tingkat kontrol dengan melampirkan handler sebagai bagian dari penimpaan OnApplyTemplate dalam definisi kelas. Kemudian Anda dapat menangkap peristiwa input yang menggelegak hingga akar kontrol saat instans.

Properti Yang Ditangani

Beberapa kelas data peristiwa untuk peristiwa rute tertentu berisi properti bernama Ditangani. Misalnya, lihat PointerRoutedEventArgs.Handled, KeyRoutedEventArgs.Handled, DragEventArgs.Handled. Dalam semua kasus Yang Ditangani adalah properti Boolean yang dapat diatur.

Mengatur properti Ditangani ke true memengaruhi perilaku sistem peristiwa. Ketika Ditangani benar, perutean berhenti untuk sebagian besar penanganan aktivitas; peristiwa tidak berlanjut di sepanjang rute untuk memberi tahu penangan terlampir lainnya tentang kasus peristiwa tertentu tersebut. Apa artinya "ditangani" dalam konteks peristiwa dan bagaimana aplikasi Anda meresponsnya terserah Anda. Pada dasarnya, Handled adalah protokol sederhana yang memungkinkan kode aplikasi untuk menyatakan bahwa terjadinya peristiwa tidak perlu menggelegak ke kontainer apa pun, logika aplikasi Anda telah mengurus apa yang perlu dilakukan. Sebaliknya, Anda harus berhati-hati bahwa Anda tidak menangani peristiwa yang mungkin harus menggelegak sehingga perilaku sistem atau kontrol bawaan dapat bertindak. Misalnya, menangani peristiwa tingkat rendah dalam bagian atau item kontrol pilihan dapat merugikan. Kontrol pilihan mungkin mencari peristiwa input untuk mengetahui bahwa pilihan harus berubah.

Tidak semua peristiwa yang dirutekan dapat membatalkan rute dengan cara ini, dan Anda dapat mengetahuinya karena tidak akan memiliki properti Yang Ditangani . Misalnya, GotFocus dan LostFocus melakukan gelembung, tetapi mereka selalu menggelegak sepanjang jalan ke akar, dan kelas data peristiwa mereka tidak memiliki properti Tertangani yang dapat memengaruhi perilaku tersebut.

Input penanganan aktivitas dalam kontrol

Kontrol Windows Runtime tertentu terkadang menggunakan konsep Ditangani untuk peristiwa input secara internal. Ini dapat membuatnya tampak seperti peristiwa input tidak pernah terjadi, karena kode pengguna Anda tidak dapat menanganinya. Misalnya, kelas Tombol menyertakan logika yang sengaja menangani peristiwa input umum PointerPressed. Ini dilakukan karena tombol mengaktifkan peristiwa Klik yang dimulai oleh input yang ditekan penunjuk, serta oleh mode input lainnya seperti tombol penanganan seperti tombol Enter yang dapat memanggil tombol saat difokuskan. Untuk tujuan desain kelas Tombol, peristiwa input mentah ditangani secara konseptual, dan konsumen kelas seperti kode pengguna Anda dapat berinteraksi dengan peristiwa Klik yang relevan dengan kontrol. Topik untuk kelas kontrol tertentu dalam referensi WINDOWS Runtime API sering mencatat perilaku penanganan peristiwa yang diterapkan kelas. Dalam beberapa kasus, Anda dapat mengubah perilaku dengan mengesampingkan metode OnEvent . Misalnya, Anda dapat mengubah bagaimana kelas turunan TextBox Anda bereaksi terhadap input kunci dengan menimpa Control.OnKeyDown.

Mendaftarkan handler untuk peristiwa rute yang sudah ditangani

Sebelumnya kami mengatakan bahwa pengaturan Ditangani ke true mencegah sebagian besar handler dipanggil. Tetapi metode AddHandler menyediakan teknik di mana Anda dapat melampirkan handler yang selalu dipanggil untuk rute, bahkan jika beberapa handler lain sebelumnya dalam rute telah mengatur Handled ke true dalam data peristiwa bersama. Teknik ini berguna jika kontrol yang Anda gunakan telah menangani peristiwa dalam pembuatan internalnya atau untuk logika khusus kontrol. tetapi Anda masih ingin menanggapinya dari instans kontrol, atau antarmuka pengguna aplikasi Anda. Tetapi gunakan teknik ini dengan hati-hati, karena dapat bertentangan dengan tujuan Ditangani dan mungkin merusak interaksi yang dimaksudkan kontrol.

Hanya peristiwa yang dirutekan yang memiliki pengidentifikasi peristiwa yang dirutekan yang sesuai yang dapat menggunakan teknik penanganan peristiwa AddHandler, karena pengidentifikasi adalah input yang diperlukan dari metode AddHandler. Lihat dokumentasi referensi untuk AddHandler untuk daftar peristiwa yang memiliki pengidentifikasi peristiwa rute yang tersedia. Untuk sebagian besar, ini adalah daftar peristiwa yang dirutekan yang sama yang kami tunjukkan sebelumnya. Pengecualiannya adalah bahwa dua terakhir dalam daftar: GotFocus dan LostFocus tidak memiliki pengidentifikasi peristiwa yang dirutekan, sehingga Anda tidak dapat menggunakan AddHandler untuk mereka.

Peristiwa yang dirutekan di luar pohon visual

Objek tertentu berpartisipasi dalam hubungan dengan pohon visual utama yang secara konseptual seperti memiliki overlay atas visual utama. Objek ini bukan bagian dari hubungan induk-anak biasa yang menghubungkan semua elemen pohon ke akar visual. Ini adalah kasus untuk Popup atau TipsAlat yang ditampilkan. Jika Anda ingin menangani peristiwa yang dirutekan dari Popup atau ToolTip, tempatkan handler pada elemen UI tertentu yang berada dalam elemen Popup atau ToolTip dan bukan elemen Popup atau ToolTip itu sendiri. Jangan mengandalkan perutean di dalam komposit apa pun yang dilakukan untuk konten Popup atau ToolTip . Ini karena perutean peristiwa untuk peristiwa yang dirutekan hanya berfungsi di sepanjang pohon visual utama. Popup atau TipsAlat tidak dianggap sebagai induk elemen UI anak perusahaan dan tidak pernah menerima peristiwa yang dirutekan, bahkan jika mencoba menggunakan sesuatu seperti latar belakang default Popup sebagai area tangkapan untuk peristiwa input.

Tekan peristiwa pengujian dan input

Menentukan apakah dan di mana di UI elemen terlihat oleh input mouse, sentuhan, dan stylus disebut pengujian hit. Untuk tindakan sentuhan dan juga untuk peristiwa khusus interaksi atau manipulasi yang merupakan konsekuensi dari tindakan sentuhan, elemen harus dapat di-hit-test agar dapat menjadi sumber peristiwa dan menembakkan peristiwa yang terkait dengan tindakan. Jika tidak, tindakan melewati elemen ke elemen yang mendasar atau elemen induk di pohon visual yang dapat berinteraksi dengan input tersebut. Ada beberapa faktor yang memengaruhi pengujian hit, tetapi Anda dapat menentukan apakah elemen tertentu dapat menembakkan peristiwa input dengan memeriksa properti IsHitTestVisible-nya. Properti ini mengembalikan true hanya jika elemen memenuhi kriteria ini:

  • Nilai properti Visibilitas elemen terlihat.
  • Nilai properti Latar Belakang atau Isian elemen tidak null. Nilai NullBrush menghasilkan transparansi dan mencapai tes tidak terlihat. (Untuk membuat elemen transparan tetapi juga dapat diuji, gunakan Kuas transparan alih-alih null.)

CatatanLatar Belakang dan Isian tidak ditentukan oleh UIElement, dan sebaliknya didefinisikan oleh kelas turunan yang berbeda seperti Kontrol dan Bentuk. Tetapi implikasi kuas yang Anda gunakan untuk properti latar depan dan latar belakang sama untuk pengujian hit dan peristiwa input, tidak peduli subkelas mana yang mengimplementasikan properti.

  • Jika elemen adalah kontrol, nilai properti IsEnabled-nya harus benar.
  • Elemen harus memiliki dimensi aktual dalam tata letak. Elemen di mana ActualHeight dan ActualWidth adalah 0 tidak akan mengaktifkan peristiwa input.

Beberapa kontrol memiliki aturan khusus untuk pengujian hit. Misalnya, TextBlock tidak memiliki properti Latar Belakang , tetapi masih dapat diuji di seluruh wilayah dimensinya. Kontrol Gambar dan MediaElement dapat diuji melalui dimensi persegi panjang yang ditentukan, terlepas dari konten transparan seperti saluran alfa dalam file sumber media yang ditampilkan. Kontrol WebView memiliki perilaku pengujian hit khusus karena input dapat ditangani oleh HTML yang dihosting dan peristiwa skrip kebakaran.

Sebagian besar kelas Panel dan Batas tidak dapat diuji di latar belakang mereka sendiri, tetapi masih dapat menangani peristiwa input pengguna yang dirutekan dari elemen yang dikandungnya.

Anda dapat menentukan elemen mana yang terletak pada posisi yang sama dengan peristiwa input pengguna, terlepas dari apakah elemen dapat diuji. Untuk melakukan ini, panggil metode FindElementsInHostCoordinates. Seperti namanya, metode ini menemukan elemen di lokasi yang relatif terhadap elemen host tertentu. Namun, perubahan transformasi dan tata letak yang diterapkan dapat menyesuaikan sistem koordinat relatif elemen, dan karenanya memengaruhi elemen mana yang ditemukan di lokasi tertentu.

Komandan

Sejumlah kecil elemen UI mendukung perintah. Perintah menggunakan peristiwa rute terkait input dalam implementasi yang mendasar dan memungkinkan pemrosesan input UI terkait (tindakan penunjuk tertentu, kunci akselerator tertentu) dengan memanggil satu handler perintah. Jika perintah tersedia untuk elemen UI, pertimbangkan untuk menggunakan API perintahnya alih-alih peristiwa input diskrit. Anda biasanya menggunakan referensi Pengikatan ke dalam properti kelas yang menentukan model tampilan untuk data. Properti menyimpan perintah bernama yang mengimplementasikan pola perintah ICommand khusus bahasa. Untuk informasi selengkapnya, lihat ButtonBase.Command.

Peristiwa kustom di Windows Runtime

Untuk tujuan menentukan peristiwa kustom, bagaimana Anda menambahkan peristiwa dan apa artinya untuk desain kelas Anda sangat tergantung pada bahasa pemrograman mana yang Anda gunakan.

  • Untuk C# dan Visual Basic, Anda menentukan peristiwa CLR. Anda dapat menggunakan pola peristiwa .NET standar, selama Anda tidak menggunakan aksesor kustom (tambahkan/hapus). Tips tambahan:
    • Untuk penanganan aktivitas, ada baiknya menggunakan System.EventHandler<TEventArgs> karena memiliki terjemahan bawaan ke event generik Windows Runtime mendelegasikan EventHandler<T>.
    • Jangan mendasarkan kelas data peristiwa Anda di System.EventArgs karena tidak diterjemahkan ke Windows Runtime. Gunakan kelas data peristiwa yang ada atau tidak ada kelas dasar.
    • Jika Anda menggunakan aksesor kustom, lihat Peristiwa kustom dan aksesor peristiwa di komponen Windows Runtime.
    • Jika Anda tidak jelas tentang pola peristiwa .NET standar, lihat Menentukan Peristiwa untuk Kelas Silverlight Kustom. Ini ditulis untuk Microsoft Silverlight tetapi masih merupakan penjumlahan kode dan konsep yang baik untuk pola peristiwa .NET standar.
  • Untuk C++/CX, lihat Peristiwa (C++/CX).
    • Gunakan referensi bernama bahkan untuk penggunaan peristiwa kustom Anda sendiri. Jangan gunakan lambda untuk peristiwa kustom, ini dapat membuat referensi melingkar.

Anda tidak dapat mendeklarasikan peristiwa rute kustom untuk Windows Runtime; peristiwa yang dirutekan terbatas pada set yang berasal dari Windows Runtime.

Menentukan peristiwa kustom biasanya dilakukan sebagai bagian dari latihan menentukan kontrol kustom. Ini adalah pola umum untuk memiliki properti dependensi yang memiliki panggilan balik yang diubah properti, dan untuk juga menentukan peristiwa kustom yang diaktifkan oleh panggilan balik properti dependensi dalam beberapa atau semua kasus. Konsumen kontrol Anda tidak memiliki akses ke panggilan balik yang diubah properti yang Anda tentukan, tetapi memiliki peristiwa pemberitahuan yang tersedia adalah hal terbaik berikutnya. Untuk informasi selengkapnya, lihat Properti dependensi kustom.