Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Subsistem Windows Presentation Foundation (WPF) menyediakan API yang kuat untuk mendapatkan input dari berbagai perangkat, termasuk mouse, keyboard, sentuhan, dan stylus. Topik ini menjelaskan layanan yang disediakan oleh WPF dan menjelaskan arsitektur sistem input.
Masukan API
Paparan API input utama ditemukan pada kelas elemen dasar: UIElement, , ContentElementFrameworkElement, dan FrameworkContentElement. Untuk informasi selengkapnya tentang elemen dasar, lihat Gambaran Umum Elemen Dasar. Kelas-kelas ini menyediakan fungsionalitas untuk peristiwa input yang terkait dengan penekanan tombol, tombol mouse, roda mouse, gerakan mouse, manajemen fokus, dan penangkapan mouse, dan lain-lain. Dengan menempatkan API input pada elemen dasar, daripada memperlakukan semua peristiwa input sebagai layanan, arsitektur input memungkinkan peristiwa input bersumber dari objek tertentu di UI, dan untuk mendukung skema perutean peristiwa di mana lebih dari satu elemen memiliki kesempatan untuk menangani peristiwa input. Banyak peristiwa input memiliki sepasang peristiwa yang terkait dengannya. Misalnya, peristiwa tekan tombol dikaitkan dengan peristiwa KeyDown dan PreviewKeyDown. Perbedaan dalam kejadian ini adalah bagaimana mereka disalurkan ke elemen target. Peristiwa pratinjau mengalir turun melalui pohon elemen dari elemen akar ke elemen target. Peristiwa gelembung naik dari elemen target ke elemen akar. Perutean peristiwa di WPF dibahas secara lebih rinci nanti dalam gambaran umum ini dan di Gambaran Umum Peristiwa Yang Dirutekan.
Kelas Keyboard dan Mouse
Selain API input pada kelas elemen dasar, Keyboard kelas dan Mouse kelas menyediakan API tambahan untuk bekerja dengan input keyboard dan mouse.
Contoh API input pada Keyboard kelas adalah Modifiers properti , yang mengembalikan ModifierKeys yang saat ini ditekan, dan IsKeyDown metode , yang menentukan apakah tombol yang ditentukan ditekan.
Contoh berikut menggunakan GetKeyStates metode untuk menentukan apakah a Key berada dalam status tidak berfungsi.
// Uses the Keyboard.GetKeyStates to determine if a key is down.
// A bitwise AND operation is used in the comparison.
// e is an instance of KeyEventArgs.
if ((Keyboard.GetKeyStates(Key.Return) & KeyStates.Down) > 0)
{
btnNone.Background = Brushes.Red;
}
' Uses the Keyboard.GetKeyStates to determine if a key is down.
' A bitwise AND operation is used in the comparison.
' e is an instance of KeyEventArgs.
If (Keyboard.GetKeyStates(Key.Return) And KeyStates.Down) > 0 Then
btnNone.Background = Brushes.Red
Contoh API input kelas Mouse adalah MiddleButton, yang menghasilkan status tombol tengah mouse, dan DirectlyOver, yang menghasilkan elemen di mana penunjuk mouse saat ini berada.
Contoh berikut menentukan apakah LeftButton pada mouse berada dalam status Pressed .
if (Mouse.LeftButton == MouseButtonState.Pressed)
{
UpdateSampleResults("Left Button Pressed");
}
If Mouse.LeftButton = MouseButtonState.Pressed Then
UpdateSampleResults("Left Button Pressed")
End If
Kelas Mouse dan Keyboard dibahas secara lebih rinci di seluruh gambaran umum ini.
Masukan Pena Stylus
WPF memiliki dukungan terintegrasi untuk Stylus. Stylus adalah input pena yang dijadikan populer oleh PC Tablet. Aplikasi WPF dapat memperlakukan stylus sebagai mouse dengan menggunakan API mouse, tetapi WPF juga mengekspos abstraksi perangkat stylus yang menggunakan model yang mirip dengan keyboard dan mouse. Semua API terkait stylus berisi kata "Stylus".
Karena stylus dapat bertindak sebagai mouse, aplikasi yang hanya mendukung input mouse masih dapat memperoleh beberapa tingkat dukungan stylus secara otomatis. Ketika stylus digunakan dengan cara seperti itu, aplikasi diberi kesempatan untuk menangani peristiwa stylus yang sesuai dan kemudian menangani peristiwa mouse yang sesuai. Selain itu, layanan tingkat yang lebih tinggi seperti input tinta juga tersedia melalui abstraksi perangkat stylus. Untuk informasi selengkapnya tentang tinta sebagai input, lihat Mulai menggunakan Tinta.
Perutean Peristiwa
FrameworkElement dapat berisi elemen lain sebagai elemen turunan dalam model kontennya, membentuk pohon elemen. Dalam WPF, elemen induk dapat berpartisipasi dalam input yang diarahkan ke elemen turunannya atau keturunan lainnya dengan menyerahkan peristiwa. Ini sangat berguna untuk membangun kontrol dari kontrol yang lebih kecil, proses yang dikenal sebagai "komposisi kontrol" atau "penyusunan." Untuk informasi selengkapnya tentang pohon elemen dan bagaimana pohon elemen berhubungan dengan rute peristiwa, lihat Pohon di WPF.
Perutean peristiwa adalah proses penerusan peristiwa ke beberapa elemen, sehingga objek atau elemen tertentu di sepanjang rute dapat memilih untuk menawarkan respons signifikan (melalui penanganan) ke peristiwa yang mungkin bersumber dari elemen yang berbeda. Peristiwa yang dirutekan menggunakan salah satu dari tiga mekanisme perutean: langsung, gelembung, dan penerowongan. Dalam perutean langsung, elemen sumber adalah satu-satunya elemen yang diberi tahu, dan peristiwa tidak dirutekan ke elemen lain. Namun, peristiwa berjalur langsung masih menawarkan beberapa fitur tambahan yang hanya ada untuk peristiwa berjalur dibandingkan dengan peristiwa CLR standar. Gelembung bekerja pada pohon elemen, dimulai dari memberi tahu elemen asal peristiwa, lalu elemen induk, dan seterusnya. Penerowongan dimulai di akar pohon elemen dan bekerja ke bawah, berakhir dengan elemen sumber asli. Untuk informasi selengkapnya tentang peristiwa yang dirutekan, lihat Gambaran Umum Peristiwa Yang Dirutekan.
Peristiwa input WPF umumnya datang berpasangan yang terdiri dari peristiwa penerowongan dan peristiwa gelembung. Peristiwa terkait penerowongan dibedakan dari peristiwa terkait gelembung dengan awalan "Pratinjau". Misalnya, PreviewMouseMove adalah versi penerowongan dari peristiwa pemindahan mouse dan MouseMove merupakan versi menggelegak dari peristiwa ini. Pemasangan peristiwa ini adalah konvensi yang diimplementasikan pada tingkat elemen dan bukan kemampuan melekat dari sistem peristiwa WPF. Untuk informasi lebih lanjut, lihat bagian Peristiwa Input WPF di Ikhtisar Peristiwa yang Dirutekan.
Menangani Peristiwa Input
Untuk menerima input pada elemen, penanganan aktivitas harus dikaitkan dengan peristiwa tertentu. Di XAML, ini mudah: Anda mereferensikan nama peristiwa sebagai atribut elemen yang akan mendengarkan peristiwa ini. Kemudian, Anda menetapkan nilai atribut ke nama penanganan aktivitas yang Anda tentukan, berdasarkan delegasi. Penanganan aktivitas harus ditulis dalam kode seperti C# dan dapat disertakan dalam file code-behind.
Peristiwa keyboard terjadi ketika sistem operasi melaporkan tindakan kunci yang terjadi saat fokus keyboard berada pada elemen. Peristiwa mouse dan stylus masing-masing termasuk dalam dua kategori: peristiwa yang melaporkan perubahan posisi penunjuk relatif terhadap elemen, dan peristiwa yang melaporkan perubahan status tombol perangkat.
Contoh Kejadian Input Keyboard
Contoh berikut mendengarkan penekanan tombol panah kiri. StackPanel dibuat yang memiliki Button. Penanganan aktivitas untuk mendengarkan penekanan tombol panah kiri dilampirkan ke Button instans.
Bagian pertama dari contoh membuat StackPanel dan Button dan melampirkan penanganan kejadian untuk KeyDown.
<StackPanel>
<Button Background="AliceBlue"
KeyDown="OnButtonKeyDown"
Content="Button1"/>
</StackPanel>
// Create the UI elements.
StackPanel keyboardStackPanel = new StackPanel();
Button keyboardButton1 = new Button();
// Set properties on Buttons.
keyboardButton1.Background = Brushes.AliceBlue;
keyboardButton1.Content = "Button 1";
// Attach Buttons to StackPanel.
keyboardStackPanel.Children.Add(keyboardButton1);
// Attach event handler.
keyboardButton1.KeyDown += new KeyEventHandler(OnButtonKeyDown);
' Create the UI elements.
Dim keyboardStackPanel As New StackPanel()
Dim keyboardButton1 As New Button()
' Set properties on Buttons.
keyboardButton1.Background = Brushes.AliceBlue
keyboardButton1.Content = "Button 1"
' Attach Buttons to StackPanel.
keyboardStackPanel.Children.Add(keyboardButton1)
' Attach event handler.
AddHandler keyboardButton1.KeyDown, AddressOf OnButtonKeyDown
Bagian kedua ditulis dalam kode dan menentukan penanganan aktivitas. Saat tombol panah kiri ditekan dan Button memiliki fokus keyboard, handler dijalankan, dan warna Background pada Button diubah. Jika tombol ditekan, tetapi bukan tombol panah kiri, Background warna Button diubah kembali ke warna awalnya.
private void OnButtonKeyDown(object sender, KeyEventArgs e)
{
Button source = e.Source as Button;
if (source != null)
{
if (e.Key == Key.Left)
{
source.Background = Brushes.LemonChiffon;
}
else
{
source.Background = Brushes.AliceBlue;
}
}
}
Private Sub OnButtonKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
Dim source As Button = TryCast(e.Source, Button)
If source IsNot Nothing Then
If e.Key = Key.Left Then
source.Background = Brushes.LemonChiffon
Else
source.Background = Brushes.AliceBlue
End If
End If
End Sub
Contoh Peristiwa Input Mouse
Dalam contoh berikut, warna Background dari sebuah Button diubah ketika penunjuk mouse memasuki Button. Warna Background dipulihkan ketika mouse meninggalkan Button.
Bagian pertama dari contoh membuat StackPanel dan Button kontrol dan melampirkan penanganan aktivitas untuk MouseEnter peristiwa dan MouseLeave ke Button.
<StackPanel>
<Button Background="AliceBlue"
MouseEnter="OnMouseExampleMouseEnter"
MouseLeave="OnMosueExampleMouseLeave">Button
</Button>
</StackPanel>
// Create the UI elements.
StackPanel mouseMoveStackPanel = new StackPanel();
Button mouseMoveButton = new Button();
// Set properties on Button.
mouseMoveButton.Background = Brushes.AliceBlue;
mouseMoveButton.Content = "Button";
// Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton);
// Attach event handler.
mouseMoveButton.MouseEnter += new MouseEventHandler(OnMouseExampleMouseEnter);
mouseMoveButton.MouseLeave += new MouseEventHandler(OnMosueExampleMouseLeave);
' Create the UI elements.
Dim mouseMoveStackPanel As New StackPanel()
Dim mouseMoveButton As New Button()
' Set properties on Button.
mouseMoveButton.Background = Brushes.AliceBlue
mouseMoveButton.Content = "Button"
' Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton)
' Attach event handler.
AddHandler mouseMoveButton.MouseEnter, AddressOf OnMouseExampleMouseEnter
AddHandler mouseMoveButton.MouseLeave, AddressOf OnMosueExampleMouseLeave
Bagian kedua dari contoh ditulis dalam kode dan menentukan penanganan aktivitas. Ketika mouse memasuki Button, warna Background dari Button diubah menjadi SlateGray. Ketika mouse meninggalkan Button, warna Background diubah kembali menjadi Button.
private void OnMouseExampleMouseEnter(object sender, MouseEventArgs e)
{
// Cast the source of the event to a Button.
Button source = e.Source as Button;
// If source is a Button.
if (source != null)
{
source.Background = Brushes.SlateGray;
}
}
Private Sub OnMouseExampleMouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs)
' Cast the source of the event to a Button.
Dim source As Button = TryCast(e.Source, Button)
' If source is a Button.
If source IsNot Nothing Then
source.Background = Brushes.SlateGray
End If
End Sub
private void OnMosueExampleMouseLeave(object sender, MouseEventArgs e)
{
// Cast the source of the event to a Button.
Button source = e.Source as Button;
// If source is a Button.
if (source != null)
{
source.Background = Brushes.AliceBlue;
}
}
Private Sub OnMosueExampleMouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
' Cast the source of the event to a Button.
Dim source As Button = TryCast(e.Source, Button)
' If source is a Button.
If source IsNot Nothing Then
source.Background = Brushes.AliceBlue
End If
End Sub
Input Teks
Peristiwa ini TextInput memungkinkan Anda untuk merespons input teks dengan cara yang independen dari perangkat. Keyboard adalah sarana utama input teks, tetapi ucapan, tulisan tangan, dan perangkat input lainnya juga dapat menghasilkan input teks.
Untuk input keyboard, WPF terlebih dahulu mengirimkan peristiwa yang sesuai KeyDown/KeyUp . Jika peristiwa tersebut tidak ditangani dan tombolnya adalah teks (bukan tombol kontrol seperti panah arah atau tombol fungsi), maka peristiwa TextInput dipicu. Tidak selalu ada pemetaan satu-ke-satu sederhana antara KeyDown/KeyUp dan TextInput peristiwa karena beberapa penekanan tombol dapat menghasilkan satu karakter input teks dan penekanan tombol tunggal dapat menghasilkan string multi-karakter. Ini terutama berlaku untuk bahasa seperti Cina, Jepang, dan Korea yang menggunakan Editor Metode Input (IMEs) untuk menghasilkan ribuan karakter yang mungkin dalam alfabet yang sesuai.
Ketika WPF mengirimkan acara KeyUp/KeyDown, Key diatur ke Key.System jika penekanan tombol dapat menjadi bagian dari peristiwa TextInput (misalnya, jika ALT+S ditekan). Ini memungkinkan kode dalam KeyDown penangan acara untuk memeriksa Key.System dan, jika ditemukan, meninggalkan pemrosesan untuk penangan acara yang peristiwanya kemudian dinaikkan TextInput. Dalam kasus ini, berbagai properti TextCompositionEventArgs argumen dapat digunakan untuk menentukan penekanan tombol asli. Demikian pula, jika IME aktif, Key memiliki nilai Key.ImeProcessed, dan ImeProcessedKey memberikan penekanan tombol asli.
Contoh berikut mendefinisikan handler untuk Click peristiwa dan handler untuk peristiwa tersebut KeyDown .
Segmen kode atau markup pertama membuat antarmuka pengguna.
<StackPanel KeyDown="OnTextInputKeyDown">
<Button Click="OnTextInputButtonClick"
Content="Open" />
<TextBox> . . . </TextBox>
</StackPanel>
// Create the UI elements.
StackPanel textInputStackPanel = new StackPanel();
Button textInputeButton = new Button();
TextBox textInputTextBox = new TextBox();
textInputeButton.Content = "Open";
// Attach elements to StackPanel.
textInputStackPanel.Children.Add(textInputeButton);
textInputStackPanel.Children.Add(textInputTextBox);
// Attach event handlers.
textInputStackPanel.KeyDown += new KeyEventHandler(OnTextInputKeyDown);
textInputeButton.Click += new RoutedEventHandler(OnTextInputButtonClick);
' Create the UI elements.
Dim textInputStackPanel As New StackPanel()
Dim textInputeButton As New Button()
Dim textInputTextBox As New TextBox()
textInputeButton.Content = "Open"
' Attach elements to StackPanel.
textInputStackPanel.Children.Add(textInputeButton)
textInputStackPanel.Children.Add(textInputTextBox)
' Attach event handlers.
AddHandler textInputStackPanel.KeyDown, AddressOf OnTextInputKeyDown
AddHandler textInputeButton.Click, AddressOf OnTextInputButtonClick
Segmen kode kedua berisi penanganan aktivitas.
private void OnTextInputKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.O && Keyboard.Modifiers == ModifierKeys.Control)
{
handle();
e.Handled = true;
}
}
private void OnTextInputButtonClick(object sender, RoutedEventArgs e)
{
handle();
e.Handled = true;
}
public void handle()
{
MessageBox.Show("Pretend this opens a file");
}
Private Sub OnTextInputKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
If e.Key = Key.O AndAlso Keyboard.Modifiers = ModifierKeys.Control Then
handle()
e.Handled = True
End If
End Sub
Private Sub OnTextInputButtonClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
handle()
e.Handled = True
End Sub
Public Sub handle()
MessageBox.Show("Pretend this opens a file")
End Sub
Karena peristiwa input mengalir ke atas dalam rute peristiwa, StackPanel menerima input terlepas dari elemen mana yang memiliki fokus keyboard. Kontrol TextBox diberi tahu terlebih dahulu dan OnTextInputKeyDown handler dipanggil hanya jika TextBox tidak menangani input. Jika peristiwa PreviewKeyDown digunakan alih-alih peristiwa KeyDown, handler OnTextInputKeyDown akan dipanggil lebih dulu.
Dalam contoh ini, logika penanganan ditulis dua kali—satu kali untuk CTRL+O, dan sekali lagi untuk peristiwa klik tombol. Ini dapat disederhanakan dengan menggunakan perintah, alih-alih menangani peristiwa input secara langsung. Perintah dibahas dalam gambaran umum ini dan di Gambaran Umum Perintah.
Sentuhan dan Manipulasi
Perangkat keras dan API baru dalam sistem operasi Windows 7 menyediakan aplikasi kemampuan untuk menerima input dari beberapa sentuhan secara bersamaan. WPF memungkinkan aplikasi mendeteksi dan merespons sentuhan dengan cara yang mirip dengan merespons input lain, seperti mouse atau keyboard, dengan menaikkan peristiwa ketika sentuhan terjadi.
WPF memaparkan dua jenis peristiwa ketika sentuhan terjadi: peristiwa sentuhan dan peristiwa manipulasi. Peristiwa sentuh menyediakan data mentah tentang setiap jari pada layar sentuh dan gerakannya. Peristiwa manipulasi menafsirkan input sebagai tindakan tertentu. Kedua jenis peristiwa dibahas di bagian ini.
Prasyarat
Anda memerlukan komponen berikut untuk mengembangkan aplikasi yang merespons sentuhan.
Visual Studio 2010.
Windows 7.
Perangkat, seperti layar sentuh, yang mendukung Windows Touch.
Terminologi
Istilah berikut digunakan saat sentuhan dibahas.
Touch adalah jenis input pengguna yang dikenali oleh Windows 7. Biasanya, sentuhan dimulai dengan meletakkan jari pada layar yang sensitif terhadap sentuhan. Perhatikan bahwa perangkat seperti touchpad yang umum di komputer laptop tidak mendukung sentuhan jika perangkat hanya mengonversi posisi jari dan gerakan sebagai input mouse.
Multitouch adalah sentuhan yang terjadi dari lebih dari satu titik secara bersamaan. Windows 7 dan WPF mendukung multitouch. Setiap kali sentuhan dibahas dalam dokumentasi untuk WPF, konsepnya berlaku untuk multitouch.
Manipulasi terjadi ketika sentuhan ditafsirkan sebagai tindakan fisik yang diterapkan pada objek. Dalam WPF, peristiwa manipulasi menafsirkan input sebagai manipulasi terjemahan, ekspansi, atau rotasi.
mewakili
touch deviceperangkat yang menghasilkan input sentuh, seperti satu jari pada layar sentuh.
Kontrol yang Merespons Sentuhan
Kontrol berikut dapat digulir dengan menyeret jari di seluruh kontrol jika memiliki konten yang digulir di luar tampilan.
ScrollViewer menentukan ScrollViewer.PanningMode properti terlampir yang memungkinkan Anda menentukan apakah pengalih sentuhan diaktifkan secara horizontal, vertikal, keduanya, atau tidak keduanya. Properti ScrollViewer.PanningDeceleration menentukan seberapa cepat pengguliran melambat ketika pengguna mengangkat jari dari layar sentuh. Properti ScrollViewer.PanningRatio terlampir menentukan rasio antara offset gulir dan offset perubahan manipulasi.
Peristiwa Sentuh
Kelas dasar, UIElement, , UIElement3Ddan ContentElement, menentukan peristiwa yang dapat Anda berlangganan sehingga aplikasi Anda akan merespons sentuhan. Peristiwa sentuhan berguna saat aplikasi Anda menafsirkan sentuhan sebagai sesuatu selain memanipulasi objek. Misalnya, aplikasi yang memungkinkan pengguna menggambar dengan satu atau beberapa jari akan berlangganan peristiwa sentuh.
Ketiga kelas mendefinisikan peristiwa berikut, yang berperilaku sama, terlepas dari kelas yang menentukan.
Seperti peristiwa keyboard dan mouse, peristiwa sentuhan adalah peristiwa yang dapat diarahkan. Peristiwa yang dimulai dengan Preview adalah peristiwa tunneling dan peristiwa yang dimulai dengan Touch adalah peristiwa bubbling. Untuk informasi selengkapnya tentang peristiwa yang dirutekan, lihat Gambaran Umum Peristiwa Yang Dirutekan. Ketika menangani peristiwa ini, Anda bisa mendapatkan posisi input, relatif terhadap elemen apa pun, dengan memanggil metode GetTouchPoint atau GetIntermediateTouchPoints.
Untuk memahami interaksi di antara peristiwa sentuhan, pertimbangkan skenario di mana pengguna meletakkan satu jari pada elemen, menggerakkan jari dalam elemen, lalu mengangkat jari dari elemen. Ilustrasi berikut menunjukkan eksekusi peristiwa bubbling (peristiwa tunneling dihilangkan untuk menjaga kesederhanaan).
Peristiwa sentuhan
Daftar berikut menjelaskan urutan peristiwa dalam ilustrasi sebelumnya.
Peristiwa terjadi satu kali ketika pengguna meletakkan jari pada elemen TouchEnter.
Peristiwa TouchDown terjadi satu kali.
Peristiwa ini terjadi TouchMove beberapa kali saat pengguna memindahkan jari di dalam elemen.
Peristiwa TouchUp terjadi satu kali ketika pengguna mengangkat jari dari elemen.
Peristiwa TouchLeave terjadi satu kali.
Ketika lebih dari dua jari digunakan, peristiwa terjadi untuk setiap jari.
Peristiwa Manipulasi
Untuk kasus di mana aplikasi memungkinkan pengguna untuk memanipulasi objek, UIElement kelas menentukan peristiwa manipulasi. Tidak seperti peristiwa sentuhan yang hanya melaporkan posisi sentuhan, peristiwa manipulasi melaporkan bagaimana input dapat ditafsirkan. Ada tiga jenis manipulasi, terjemahan, ekspansi, dan rotasi. Daftar berikut menjelaskan cara memanggil tiga jenis manipulasi.
Letakkan jari pada objek dan gerakkan jari di layar sentuh untuk memanggil manipulasi terjemahan. Ini biasanya memindahkan objek.
Letakkan dua jari pada objek dan gerakkan jari-jari lebih dekat bersama-sama atau lebih jauh dari satu sama lain untuk memanggil manipulasi ekspansi. Ini biasanya mengubah ukuran objek.
Letakkan dua jari pada objek dan putar jari di sekitar satu sama lain untuk memanggil manipulasi rotasi. Ini biasanya memutar objek.
Lebih dari satu jenis manipulasi dapat terjadi secara bersamaan.
Ketika Anda menyebabkan objek merespons manipulasi, Anda dapat memiliki objek tampaknya memiliki inertia. Ini dapat membuat objek Anda mensimulasikan dunia fisik. Misalnya, ketika Anda mendorong sebuah buku di atas meja, jika Anda mendorongnya dengan cukup keras, buku tersebut akan terus bergerak setelah Anda melepaskannya. WPF memungkinkan Anda untuk mensimulasikan perilaku ini dengan menjalankan peristiwa manipulasi setelah jari pengguna melepaskan objek.
Untuk informasi tentang cara membuat aplikasi yang memungkinkan pengguna memindahkan, mengubah ukuran, dan memutar objek, lihat Panduan: Membuat Aplikasi Sentuhan Pertama Anda.
UIElement mendefinisikan peristiwa manipulasi berikut.
Secara default, UIElement tidak menerima peristiwa manipulasi ini. Untuk menerima peristiwa manipulasi pada UIElement, atur UIElement.IsManipulationEnabled ke true.
Jalur Eksekusi Peristiwa Manipulasi
Pertimbangkan skenario di mana pengguna "melempar" objek. Pengguna meletakkan jari pada objek, menggerakkan jari di seberang layar sentuh untuk jarak pendek, lalu mengangkat jari saat bergerak. Hasil dari ini adalah bahwa objek akan bergerak di bawah jari pengguna dan terus bergerak setelah pengguna mengangkat jari.
Ilustrasi berikut menunjukkan jalur eksekusi peristiwa manipulasi dan informasi penting tentang setiap peristiwa.
Peristiwa manipulasi
Daftar berikut menjelaskan urutan peristiwa dalam ilustrasi sebelumnya.
Peristiwa terjadi ManipulationStarting ketika pengguna menempatkan jari pada objek. Antara lain, peristiwa ini memungkinkan Anda untuk mengatur ManipulationContainer properti . Dalam peristiwa berikutnya, posisi manipulasi akan relatif terhadap ManipulationContainer. Dalam peristiwa selain ManipulationStarting, properti ini bersifat baca-saja, sehingga ManipulationStarting peristiwa adalah satu-satunya waktu Anda dapat mengatur properti ini.
Peristiwa ManipulationStarted terjadi berikutnya. Peristiwa ini melaporkan asal usul manipulasi.
Peristiwa ini ManipulationDelta terjadi beberapa kali saat jari pengguna bergerak pada layar sentuh. Properti DeltaManipulation kelas ManipulationDeltaEventArgs melaporkan apakah manipulasi ditafsirkan sebagai gerakan, ekspansi, atau terjemahan. Di sinilah Anda melakukan sebagian besar pekerjaan memanipulasi objek.
Peristiwa ManipulationInertiaStarting terjadi ketika jari pengguna kehilangan kontak dengan objek. Kejadian ini memungkinkan Anda menentukan deselerasi manipulasi selama inertia. Ini agar objek Anda dapat meniru ruang fisik atau atribut yang berbeda jika Anda memilih. Misalnya, aplikasi Anda memiliki dua objek yang mewakili item di dunia fisik, dan satu lebih berat dari yang lain. Anda dapat membuat objek yang lebih berat terdecelerasi lebih cepat daripada objek yang lebih ringan.
Peristiwa ini ManipulationDelta terjadi beberapa kali saat inertia terjadi. Perhatikan bahwa peristiwa ini terjadi ketika jari pengguna bergerak melintasi layar sentuh dan ketika WPF mensimulasikan inertia. Dengan kata lain, ManipulationDelta terjadi sebelum dan sesudah ManipulationInertiaStarting peristiwa. Properti ManipulationDeltaEventArgs.IsInertial melaporkan apakah ManipulationDelta peristiwa terjadi selama inertia, sehingga Anda dapat memeriksa properti tersebut dan melakukan tindakan yang berbeda, tergantung pada nilainya.
Peristiwa ManipulationCompleted terjadi ketika manipulasi dan inertia serta apapun yang menyertainya berakhir. Artinya, setelah semua ManipulationDelta peristiwa terjadi, peristiwa ManipulationCompleted terjadi untuk memberi sinyal bahwa manipulasi selesai.
UIElement juga mendefinisikan acara ManipulationBoundaryFeedback. Peristiwa ini terjadi ketika metode ReportBoundaryFeedback terpanggil dalam peristiwa ManipulationDelta. Kejadian ini ManipulationBoundaryFeedback memungkinkan aplikasi atau komponen untuk memberikan umpan balik visual saat objek mencapai batas. Misalnya, kelas Window menangani event ManipulationBoundaryFeedback untuk menyebabkan jendela sedikit bergerak saat tepinya ditemui.
Anda dapat membatalkan manipulasi dengan memanggil metode Cancel melalui argumen peristiwa di sembarang peristiwa manipulasi kecuali peristiwa ManipulationBoundaryFeedback. Ketika Anda memanggil Cancel, event manipulasi tidak lagi dipicu dan event mouse terjadi akibat sentuhan. Tabel berikut menjelaskan hubungan antara waktu manipulasi dibatalkan dan peristiwa mouse yang terjadi.
| Peristiwa di mana fungsi Batal dipanggil | Peristiwa mouse yang terjadi berdasarkan input yang sudah dilakukan |
|---|---|
| ManipulationStarting dan ManipulationStarted | Peristiwa klik mouse. |
| ManipulationDelta | Peristiwa penekanan mouse dan pergerakan mouse. |
| ManipulationInertiaStarting dan ManipulationCompleted | Arahkan mouse ke bawah, gerakkan mouse, dan arahkan mouse ke atas. |
Perhatikan bahwa jika Anda memanggil Cancel saat manipulasi dalam ineria, metode mengembalikan false dan input tidak memicu peristiwa mouse.
Hubungan Antara Peristiwa Sentuhan dan Manipulasi
A UIElement selalu dapat menerima peristiwa sentuhan. Ketika properti IsManipulationEnabled diatur ke true, UIElement dapat menerima peristiwa sentuhan dan manipulasi.
TouchDown Jika peristiwa tidak ditangani (yaitu, Handled properti adalah false), logika manipulasi menangkap sentuhan ke elemen dan menghasilkan peristiwa manipulasi.
Handled Jika properti diatur ke true dalam TouchDown peristiwa, logika manipulasi tidak menghasilkan peristiwa manipulasi. Ilustrasi berikut menunjukkan hubungan antara peristiwa sentuh dan peristiwa manipulasi.
Peristiwa sentuhan dan manipulasi
Daftar berikut menjelaskan hubungan antara peristiwa sentuhan dan manipulasi yang ditampilkan dalam ilustrasi sebelumnya.
Ketika perangkat sentuh pertama menghasilkan TouchDown peristiwa pada UIElement, logika manipulasi memanggil metode CaptureTouch, yang menghasilkan GotTouchCapture peristiwa.
Ketika GotTouchCapture terjadi, logika manipulasi memanggil metode Manipulation.AddManipulator, yang menghasilkan kejadian ManipulationStarting.
Logika manipulasi menghasilkan peristiwa TouchMove yang terjadi sebelum peristiwa ManipulationDelta ketika peristiwa ManipulationInertiaStarting terjadi.
Ketika perangkat sentuh terakhir pada elemen memicu TouchUp event, logika pengolahan menghasilkan ManipulationInertiaStarting event.
Fokus
Ada dua konsep utama yang berkaitan dengan fokus dalam WPF: fokus keyboard dan fokus logis.
Fokus Keyboard
Fokus keyboard mengacu pada elemen yang menerima input keyboard. Hanya ada satu elemen pada seluruh desktop yang memiliki fokus keyboard. Di WPF, elemen yang memiliki fokus keyboard akan memiliki IsKeyboardFocused diatur ke true. Metode statis KeyboardFocusedElement mengembalikan elemen yang saat ini memiliki fokus keyboard.
Fokus keyboard dapat diperoleh dengan tab ke elemen atau dengan mengklik mouse pada elemen tertentu, seperti TextBox. Fokus keyboard juga dapat diperoleh secara terprogram dengan menggunakan metode Focus pada kelas Keyboard. Focus mencoba memberikan fokus keyboard pada elemen yang ditentukan. Elemen yang dikembalikan oleh Focus adalah elemen yang saat ini memiliki fokus keyboard.
Agar elemen mendapatkan fokus keyboard, properti Focusable dan properti IsVisible harus disetel menjadi true. Beberapa kelas, seperti Panel, telah Focusable diatur ke false secara default; oleh karena itu, Anda mungkin harus mengatur properti true ini ke jika Anda ingin elemen tersebut dapat memperoleh fokus.
Contoh berikut menggunakan Focus untuk mengatur fokus keyboard pada Button. Tempat yang disarankan untuk mengatur fokus awal dalam aplikasi adalah di penangan peristiwa Loaded.
private void OnLoaded(object sender, RoutedEventArgs e)
{
// Sets keyboard focus on the first Button in the sample.
Keyboard.Focus(firstButton);
}
Private Sub OnLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Sets keyboard focus on the first Button in the sample.
Keyboard.Focus(firstButton)
End Sub
Untuk informasi selengkapnya tentang fokus keyboard, lihat Gambaran Umum Fokus.
Fokus Logis
Fokus logis mengacu pada FocusManager.FocusedElement dalam cakupan fokus. Mungkin ada beberapa elemen yang memiliki fokus logis dalam aplikasi, tetapi mungkin hanya ada satu elemen yang memiliki fokus logis dalam cakupan fokus tertentu.
Elemen cakupan fokus adalah elemen kontainer yang menjaga agar FocusedElement tetap terlacak dalam cakupannya. Ketika fokus meninggalkan cakupan fokus, elemen yang sedang fokus akan kehilangan fokus keyboard tetapi tetap mempertahankan fokus logis. Saat fokus kembali ke lingkup fokus, elemen yang difokuskan akan mendapatkan fokus keyboard. Ini memungkinkan fokus keyboard diubah di antara beberapa cakupan fokus tetapi memastikan bahwa elemen yang difokuskan dalam cakupan fokus tetap menjadi elemen yang difokuskan saat fokus kembali.
Elemen dapat diubah menjadi cakupan fokus dalam Extensible Application Markup Language (XAML) dengan mengatur FocusManager properti IsFocusScope terlampir ke true, atau dalam kode dengan mengatur properti terlampir dengan menggunakan SetIsFocusScope metode .
Contoh berikut membuat StackPanel ke dalam cakupan fokus dengan mengatur properti terlampir IsFocusScope.
<StackPanel Name="focusScope1"
FocusManager.IsFocusScope="True"
Height="200" Width="200">
<Button Name="button1" Height="50" Width="50"/>
<Button Name="button2" Height="50" Width="50"/>
</StackPanel>
StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);
Dim focuseScope2 As New StackPanel()
FocusManager.SetIsFocusScope(focuseScope2, True)
Kelas dalam WPF yang merupakan cakupan fokus secara default adalah Window, Menu, ToolBar, dan ContextMenu.
Elemen yang memiliki fokus keyboard juga akan memiliki fokus logis untuk cakupan fokus miliknya; oleh karena itu, mengatur fokus pada elemen dengan metode Focus pada kelas Keyboard atau kelas elemen dasar akan mencoba memberikan elemen fokus keyboard dan fokus logis.
Untuk menentukan elemen yang difokuskan dalam cakupan fokus, gunakan GetFocusedElement. Untuk mengubah elemen yang difokuskan untuk cakupan fokus, gunakan SetFocusedElement.
Untuk informasi selengkapnya tentang fokus logis, lihat Gambaran Umum Fokus.
Posisi Mouse
API input WPF memberikan informasi bermanfaat sehubungan dengan ruang koordinat. Misalnya, koordinat (0,0) adalah koordinat kiri atas, tetapi bagian kiri atas elemen mana di pohon? Elemen yang menjadi sasaran input? Elemen tempat Anda melampirkan penanganan aktivitas? Atau sesuatu yang lain? Untuk menghindari kebingungan, API input WPF mengharuskan Anda menentukan bingkai referensi saat Anda bekerja dengan koordinat yang diperoleh melalui mouse. Metode GetPosition mengembalikan koordinat penunjuk mouse relatif terhadap elemen yang ditentukan.
Penangkapan Tetikus
Perangkat mouse secara khusus memegang karakteristik modal yang dikenal sebagai tangkapan mouse. Penangkapan mouse digunakan untuk mempertahankan status input transisi saat operasi seret dan letakkan dimulai, sehingga operasi lain yang melibatkan posisi nominal pada layar penunjuk mouse tidak selalu terjadi. Selama seret, pengguna tidak dapat mengklik tanpa membatalkan seret dan letakkan, yang membuat sebagian besar isyarat mouseover tidak pantas saat tangkapan mouse ditahan oleh asal seret. Sistem input mengekspos API yang dapat menentukan status penangkapan mouse, serta API yang dapat memaksa penangkapan mouse ke elemen tertentu, atau menghapus status tangkapan mouse. Untuk informasi lebih lanjut tentang fungsi seret dan lepas, lihat Ikhtisar Seret dan Lepas.
Perintah
Perintah memungkinkan penanganan input pada tingkat yang lebih semantik daripada input perangkat. Perintah adalah arahan sederhana, seperti Cut, , CopyPaste, atau Open. Perintah berguna untuk memusatkan logika perintah Anda. Perintah yang sama mungkin diakses dari Menu, pada ToolBar, atau melalui pintasan keyboard. Perintah juga menyediakan mekanisme untuk menonaktifkan kontrol ketika perintah menjadi tidak tersedia.
RoutedCommand adalah implementasi WPF dari ICommand. Ketika RoutedCommand dijalankan, peristiwa PreviewExecuted dan Executed dinaikkan pada target perintah, yang ditelusuri dan dimunculkan melalui pohon elemen seperti input lainnya. Jika target perintah tidak diatur, elemen dengan fokus keyboard akan menjadi target perintah. Logika yang melakukan perintah dilampirkan ke CommandBinding. Ketika peristiwa Executed mencapai CommandBinding untuk perintah tertentu tersebut ExecutedRoutedEventHandler , pada dipanggil CommandBinding . Handler ini melakukan tindakan perintah.
Untuk informasi selengkapnya tentang perintah, lihat Gambaran Umum Perintah.
WPF menyediakan pustaka perintah umum yang terdiri dari ApplicationCommands, , MediaCommands, ComponentCommandsNavigationCommands, dan EditingCommands, atau Anda dapat menentukan sendiri.
Contoh berikut menunjukkan cara menyiapkan MenuItem sehingga ketika diklik akan memanggil Paste perintah pada TextBox, dengan asumsi TextBox memiliki fokus keyboard.
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste" />
</Menu>
<TextBox />
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);
// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;
// Setting the command target to the TextBox
pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()
' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)
' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste
Untuk informasi selengkapnya tentang perintah di WPF, lihat Gambaran Umum Perintah.
Sistem Input dan Elemen Dasar
Peristiwa input seperti peristiwa terlampir yang ditentukan oleh Mouse, Keyboard, dan Stylus kelas diajukan oleh sistem input dan dimasukkan ke posisi tertentu dalam model objek berdasarkan pengujian pohon visual pada waktu berjalan.
Setiap peristiwa yang didefinisikan oleh Mouse, Keyboard, dan Stylus sebagai peristiwa terlampir juga dijadikan ulang oleh kelas elemen dasar UIElement dan ContentElement sebagai peristiwa rute baru. Elemen dasar dari peristiwa yang dirutekan dihasilkan oleh kelas yang menangani peristiwa terlampir asli dan mendaur ulang data peristiwa.
Ketika peristiwa input dikaitkan dengan elemen sumber tertentu melalui implementasi peristiwa input elemen dasarnya, peristiwa tersebut dapat dirutekan melalui sisa rute peristiwa yang didasarkan pada kombinasi objek pohon logis dan visual, dan ditangani oleh kode aplikasi. Umumnya, lebih mudah untuk menangani peristiwa input terkait perangkat ini menggunakan peristiwa yang dirutekan pada UIElement dan ContentElement, karena Anda dapat menggunakan sintaks penanganan aktivitas yang lebih intuitif baik dalam XAML maupun dalam kode. Anda dapat memilih untuk menangani peristiwa terlampir yang memulai proses sebagai gantinya, tetapi Anda akan menghadapi beberapa masalah: peristiwa terlampir dapat ditandai ditangani oleh penanganan kelas elemen dasar, dan Anda perlu menggunakan metode aksesor daripada sintaks peristiwa yang benar untuk melampirkan handler untuk peristiwa terlampir.
Apa Selanjutnya
Anda sekarang memiliki beberapa teknik untuk menangani input di WPF. Anda juga harus memiliki pemahaman yang lebih baik tentang berbagai jenis peristiwa input dan mekanisme peristiwa yang dirutekan yang digunakan oleh WPF.
Sumber daya tambahan tersedia yang menjelaskan elemen kerangka kerja WPF dan perutean peristiwa secara lebih rinci. Lihat gambaran umum berikut untuk informasi selengkapnya, Gambaran Umum Perintah, Gambaran Umum Fokus, Gambaran Umum Elemen Dasar, Pohon di WPF, dan Gambaran Umum Peristiwa Yang Dirutekan.
Lihat juga
- Gambaran Umum Fokus
- Gambaran Umum Perintah
- Gambaran Umum Kejadian yang Dirutekan
- Gambaran Umum Elemen Dasar
- Atribut
.NET Desktop feedback