Bagikan melalui


Gambaran Umum Input

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.

Input 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, untuk beberapa nama. 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 kunci tidak berfungsi dikaitkan dengan KeyDown peristiwa dan PreviewKeyDown . Perbedaan dalam peristiwa ini adalah bagaimana mereka dirutekan ke elemen target. Pratinjau terowongan peristiwa di bawah 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 pada Mouse kelas adalah MiddleButton, yang mendapatkan status tombol mouse tengah, dan DirectlyOver, yang mendapatkan elemen penunjuk mouse saat ini berakhir.

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.

Stylus Input

WPF memiliki dukungan terintegrasi untuk Stylus. adalah Stylus input pena yang 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 con mode tenda l, 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 yang dirutekan langsung masih menawarkan beberapa kemampuan tambahan yang hanya ada untuk peristiwa yang dirutekan dibandingkan dengan peristiwa CLR standar. Gelembung bekerja di atas pohon elemen dengan terlebih dahulu memberi tahu elemen yang bersumber peristiwa, lalu elemen induk, dan sebagainya. 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 penerowongan dibedakan dari peristiwa 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 detailnya, lihat bagian Peristiwa Input WPF di Gambaran Umum 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 Peristiwa 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 dan Button melampirkan penanganan aktivitas 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 berjalan dan Background warna 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, Background warna diubah Button saat 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, Background warna Button diubah menjadi SlateGray. Ketika mouse meninggalkan Button, Background warna Button diubah kembali ke AliceBlue.

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 mendengarkan input teks dengan cara yang independen 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 kuncinya adalah tekstual (bukan tombol kontrol seperti panah arah atau tombol fungsi), maka TextInput peristiwa dinaikkan. 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 mengirim KeyUp/KeyDown peristiwa, Key diatur ke Key.System jika penekanan tombol dapat menjadi bagian TextInput dari peristiwa (jika ALT+S ditekan, misalnya). Ini memungkinkan kode dalam KeyDown penanganan aktivitas untuk Key.System memeriksa dan, jika ditemukan, biarkan pemrosesan untuk handler peristiwa yang 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 , dan ImeProcessedKey memberikan penekanan Key.ImeProcessedtombol atau 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 menggelembungkan 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. PreviewKeyDown Jika peristiwa digunakan alih-alih KeyDown peristiwa, handler OnTextInputKeyDown akan dipanggil terlebih dahulu.

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 device perangkat 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 offset gulir untuk menerjemahkan offset 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 dirutekan. Peristiwa yang dimulai dengan Preview adalah peristiwa penerowongan dan peristiwa yang dimulai dengan Touch adalah peristiwa yang menggelegak. Untuk informasi selengkapnya tentang peristiwa yang dirutekan, lihat Gambaran Umum Peristiwa Yang Dirutekan. Saat menangani peristiwa ini, Anda bisa mendapatkan posisi input, relatif terhadap elemen apa pun, dengan memanggil GetTouchPoint metode 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 yang menggelegak (peristiwa penerowongan dihilangkan untuk kesederhanaan).

The sequence of touch events. Peristiwa sentuhan

Daftar berikut menjelaskan urutan peristiwa dalam ilustrasi sebelumnya.

  1. Peristiwa terjadi TouchEnter satu kali ketika pengguna meletakkan jari pada elemen .

  2. Peristiwa terjadi TouchDown satu kali.

  3. Peristiwa terjadi TouchMove beberapa kali saat pengguna memindahkan jari dalam elemen .

  4. Peristiwa terjadi TouchUp satu kali ketika pengguna mengangkat jari dari elemen .

  5. Peristiwa terjadi TouchLeave 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 buku di seluruh tabel, jika Anda mendorong cukup keras buku akan terus bergerak setelah Anda merilisnya. WPF memungkinkan Anda mensimulasikan perilaku ini dengan menaikkan peristiwa manipulasi setelah jari pengguna merilis objek.

Untuk informasi tentang cara membuat aplikasi yang memungkinkan pengguna memindahkan, mengubah ukuran, dan memutar objek, lihat Panduan: Membuat Aplikasi Sentuhan Pertama Anda.

mendefinisikan UIElement 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.

The sequence of manipulation events. Peristiwa manipulasi

Daftar berikut menjelaskan urutan peristiwa dalam ilustrasi sebelumnya.

  1. 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.

  2. Peristiwa ManipulationStarted terjadi berikutnya. Kejadian ini melaporkan asal manipulasi.

  3. 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.

  4. 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.

  5. 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.

  6. Peristiwa terjadi ManipulationCompleted ketika manipulasi dan inertia apa pun berakhir. Artinya, setelah semua ManipulationDelta peristiwa terjadi, peristiwa terjadi ManipulationCompleted untuk memberi sinyal bahwa manipulasi selesai.

juga UIElement mendefinisikan ManipulationBoundaryFeedback peristiwa. Peristiwa ini terjadi ketika ReportBoundaryFeedback metode dipanggil dalam ManipulationDelta peristiwa. Kejadian ini ManipulationBoundaryFeedback memungkinkan aplikasi atau komponen untuk memberikan umpan balik visual saat objek mencapai batas. Misalnya, Window kelas menangani ManipulationBoundaryFeedback peristiwa menyebabkan jendela sedikit bergerak saat tepinya ditemui.

Anda dapat membatalkan manipulasi dengan memanggil Cancel metode pada argumen peristiwa dalam peristiwa manipulasi apa pun kecuali ManipulationBoundaryFeedback peristiwa. Ketika Anda memanggil Cancel, peristiwa manipulasi tidak lagi dinaikkan dan peristiwa mouse terjadi untuk disentuh. Tabel berikut menjelaskan hubungan antara waktu manipulasi dibatalkan dan peristiwa mouse yang terjadi.

Kejadian yang batal dipanggil Peristiwa mouse yang terjadi untuk input yang sudah terjadi
ManipulationStarting dan ManipulationStarted Peristiwa mouse ke bawah.
ManipulationDelta Mouse ke bawah dan peristiwa pemindahan mouse.
ManipulationInertiaStarting dan ManipulationCompleted Arahkan mouse ke bawah, gerakkan mouse, dan arahkan mouse ke atas.

Perhatikan bahwa jika Anda memanggil Cancel ketika manipulasi dalam inertia, metode akan kembali false dan input tidak menaikkan peristiwa mouse.

Hubungan Antara Peristiwa Sentuhan dan Manipulasi

A UIElement selalu dapat menerima peristiwa sentuhan. IsManipulationEnabled Ketika properti diatur ke true, dapat UIElement 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.

Relationship between touch and manipulation events Peristiwa sentuhan dan manipulasi

Daftar berikut menjelaskan hubungan antara peristiwa sentuhan dan manipulasi yang ditampilkan dalam ilustrasi sebelumnya.

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 diatur IsKeyboardFocused 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 Focus metode pada Keyboard kelas . Focus mencoba untuk memberikan fokus keyboard elemen yang ditentukan. Elemen yang dikembalikan oleh Focus adalah elemen yang saat ini memiliki fokus keyboard.

Agar elemen mendapatkan fokus keyboard properti Focusable dan IsVisible properti harus diatur ke 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 ada di penanganan Loaded aktivitas.

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.

Cakupan fokus adalah elemen kontainer yang melacak FocusedElement dalam cakupannya. Ketika fokus meninggalkan cakupan fokus, elemen yang berfokus akan kehilangan fokus keyboard tetapi akan mempertahankan fokus logis. Saat fokus kembali ke cakupan 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 menjadi StackPanel cakupan fokus dengan mengatur IsFocusScope properti terlampir.

<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, , MenuToolBar, dan ContextMenu.

Elemen yang memiliki fokus keyboard juga akan memiliki fokus logis untuk cakupan fokus miliknya; oleh karena itu, mengatur fokus pada elemen dengan Focus metode pada Keyboard kelas atau kelas elemen dasar akan mencoba memberikan fokus keyboard elemen 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 merupakan target 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 mengembalikan GetPosition koordinat penunjuk mouse relatif terhadap elemen yang ditentukan.

Penangkapan Mouse

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 selengkapnya tentang operasi seret dan letakkan, lihat Gambaran Umum Seret dan Letakkan.

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. RoutedCommand Ketika dijalankan, dan PreviewExecuted peristiwa Executed dinaikkan pada target perintah, yang terowongan dan gelembung 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 Mousekelas , Keyboard, dan Stylus dinaikkan oleh sistem input dan disuntikkan ke posisi tertentu dalam model objek berdasarkan pengujian pohon visual pada run time.

Setiap peristiwa yang Mouse, , dan Stylus didefinisikan sebagai peristiwa terlampir juga diekspos kembali oleh kelas UIElement elemen dasar dan ContentElement sebagai peristiwa Keyboardrute baru. Elemen dasar peristiwa yang dirutekan dihasilkan oleh kelas yang menangani peristiwa terlampir asli dan menggunakan kembali 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 Berikutnya

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.

Baca juga