Akselerator keyboard

Hero image of the Surface keyboard

Tombol akselerator (atau akselerator keyboard) adalah pintasan keyboard yang meningkatkan kegunaan dan aksesibilitas aplikasi Windows Anda dengan menyediakan cara intuitif bagi pengguna untuk memanggil tindakan atau perintah umum tanpa menavigasi UI aplikasi.

Catatan

Keyboard sangat diperlukan bagi pengguna dengan disabilitas tertentu (lihat Aksesibilitas keyboard), dan juga merupakan alat penting bagi pengguna yang lebih menyukainya sebagai cara yang lebih efisien untuk berinteraksi dengan aplikasi.

Lihat topik Tombol akses untuk detail tentang menavigasi UI aplikasi Windows dengan pintasan keyboard.

Untuk membuat pintasan keyboard kustom Anda sendiri, lihat topik Peristiwa keyboard.

Gambaran Umum

Akselerator terdiri dari dua jenis kunci: pengubah dan non-pengubah. Tombol pengubah termasuk Shift, Menu, Control, dan tombol Windows, yang diekspos melalui VirtualKeyModifiers. Non-pengubah mencakup VirtualKey apa pun, seperti Hapus, F3, Bilah Spasi, Panah, Esc, dan semua kunci alfanumerik dan tanda baca.

Catatan

Akselerator biasanya menyertakan tombol fungsi F1 hingga F12 atau beberapa kombinasi kunci standar yang dipasangkan dengan satu atau beberapa tombol pengubah (CTRL, Shift). Misalnya, jika pengguna menekan Ctrl+Shift+M, kerangka kerja memeriksa pengubah (Ctrl dan Shift) dan menembakkan akselerator, jika ada.

Banyak kontrol XAML memiliki akselerator keyboard bawaan. Misalnya, ListView mendukung Ctrl+A untuk memilih semua item dalam daftar, dan RichEditBox mendukung Ctrl+Tab untuk menyisipkan Tab di kotak teks. Akselerator keyboard bawaan ini disebut sebagai akselerator kontrol dan dijalankan hanya jika fokusnya ada pada elemen atau salah satu turunannya. Akselerator yang ditentukan oleh Anda menggunakan API akselerator keyboard yang dibahas di sini disebut sebagai akselerator aplikasi.

Akselerator keyboard tidak tersedia untuk setiap tindakan tetapi sering dikaitkan dengan perintah yang diekspos dalam menu (dan harus ditentukan dengan konten item menu). Akselerator juga dapat dikaitkan dengan tindakan yang tidak memiliki item menu yang setara. Namun, karena pengguna mengandalkan menu aplikasi untuk menemukan dan mempelajari set perintah yang tersedia, Anda harus mencoba membuat penemuan akselerator semudah mungkin (menggunakan label atau pola yang ditetapkan dapat membantu hal ini).

Akselerator berulang otomatis (misalnya, ketika pengguna menekan Ctrl+Shift lalu menahan M, akselerator dipanggil berulang kali hingga M dilepaskan). Perilaku ini tidak dapat dimodifikasi.

Screenshot of keyboard accelerators in a menu item label.
Akselerator keyboard yang dijelaskan dalam label item menu

Kapan menggunakan akselerator keyboard

Kami menyarankan agar Anda menentukan akselerator keyboard di mana pun yang sesuai di UI Anda, dan mendukung akselerator di semua kontrol kustom.

  • Akselerator keyboard membuat aplikasi Anda lebih mudah diakses oleh pengguna dengan disabilitas motorik, termasuk pengguna yang hanya dapat menekan satu tombol pada satu waktu atau mengalami kesulitan menggunakan mouse.

    UI keyboard yang dirancang dengan baik adalah aspek penting dari aksesibilitas perangkat lunak. Ini memungkinkan pengguna dengan gangguan penglihatan atau yang memiliki disabilitas motorik tertentu untuk menavigasi aplikasi dan berinteraksi dengan fitur-fiturnya. Pengguna tersebut mungkin tidak dapat mengoperasikan mouse dan sebaliknya mengandalkan berbagai teknologi bantuan seperti alat peningkatan keyboard, keyboard di layar, pembenar layar, pembaca layar, dan utilitas input suara. Untuk pengguna ini, cakupan perintah komprehensif sangat penting.

  • Akselerator keyboard membuat aplikasi Anda lebih dapat digunakan untuk pengguna daya yang lebih suka berinteraksi melalui keyboard.

    Pengguna berpengalaman sering memiliki preferensi yang kuat untuk menggunakan keyboard karena perintah berbasis keyboard dapat dimasukkan lebih cepat dan tidak mengharuskan mereka untuk melepas tangan mereka dari keyboard. Untuk pengguna ini, efisiensi dan konsistensi sangat penting; komprehensif hanya penting untuk perintah yang paling sering digunakan.

Tentukan akselerator keyboard

Gunakan API KeyboardAccelerator untuk membuat akselerator keyboard di aplikasi Windows. Dengan API ini, Anda tidak perlu menangani beberapa peristiwa KeyDown untuk mendeteksi kombinasi tombol yang ditekan, dan Anda dapat melokalisasi akselerator di sumber daya aplikasi.

Sebaiknya atur akselerator keyboard untuk tindakan paling umum di aplikasi Anda dan dokumentasikan menggunakan label item menu atau tipsalat. Dalam contoh ini, kami mendeklarasikan akselerator keyboard hanya untuk perintah Ganti Nama dan Salin.

<CommandBar Margin="0,200" AccessKey="M">
  <AppBarButton 
    Icon="Share" 
    Label="Share" 
    Click="OnShare" 
    AccessKey="S" />
  <AppBarButton 
    Icon="Copy" 
    Label="Copy" 
    ToolTipService.ToolTip="Copy (Ctrl+C)" 
    Click="OnCopy" 
    AccessKey="C">
    <AppBarButton.KeyboardAccelerators>
      <KeyboardAccelerator 
        Modifiers="Control" 
        Key="C" />
    </AppBarButton.KeyboardAccelerators>
  </AppBarButton>

  <AppBarButton 
    Icon="Delete" 
    Label="Delete" 
    Click="OnDelete" 
    AccessKey="D" />
  <AppBarSeparator/>
  <AppBarButton 
    Icon="Rename" 
    Label="Rename" 
    ToolTipService.ToolTip="Rename (F2)" 
    Click="OnRename" 
    AccessKey="R">
    <AppBarButton.KeyboardAccelerators>
      <KeyboardAccelerator 
        Modifiers="None" Key="F2" />
    </AppBarButton.KeyboardAccelerators>
  </AppBarButton>

  <AppBarButton 
    Icon="SelectAll" 
    Label="Select" 
    Click="OnSelect" 
    AccessKey="A" />
  
  <CommandBar.SecondaryCommands>
    <AppBarButton 
      Icon="OpenWith" 
      Label="Sources" 
      AccessKey="S">
      <AppBarButton.Flyout>
        <MenuFlyout>
          <ToggleMenuFlyoutItem Text="OneDrive" />
          <ToggleMenuFlyoutItem Text="Contacts" />
          <ToggleMenuFlyoutItem Text="Photos"/>
          <ToggleMenuFlyoutItem Text="Videos"/>
        </MenuFlyout>
      </AppBarButton.Flyout>
    </AppBarButton>
    <AppBarToggleButton 
      Icon="Save" 
      Label="Auto Save" 
      IsChecked="True" 
      AccessKey="A"/>
  </CommandBar.SecondaryCommands>

</CommandBar>

Screenshot of a keyboard accelerator in a tooltip.
Akselerator keyboard yang dijelaskan dalam tipsalat

Objek UIElement memiliki koleksi KeyboardAccelerator , KeyboardAccelerators, di mana Anda menentukan objek KeyboardAccelerator kustom Anda dan menentukan penekanan tombol untuk akselerator keyboard:

  • Kunci - VirtualKey yang digunakan untuk akselerator keyboard.

  • PengubahVirtualKeyModifiers yang digunakan untuk akselerator keyboard. Jika Pengubah tidak diatur, nilai defaultnya adalah Tidak Ada.

Catatan

Akselerator kunci tunggal (A, Hapus, F2, Bilah Spasi, Esc, Kunci Multimedia) dan akselerator multi-kunci (Ctrl+Shift+M) didukung. Namun, kunci virtual Gamepad tidak didukung.

Akselerator cakupan

Beberapa akselerator hanya berfungsi dalam cakupan tertentu sementara yang lain bekerja di seluruh aplikasi.

Misalnya, Microsoft Outlook menyertakan akselerator berikut:

  • Ctrl+B, Ctrl+I dan ESC hanya berfungsi pada cakupan formulir kirim email
  • Ctrl+1 dan Ctrl+2 work app-wide

Menu konteks

Tindakan menu konteks hanya memengaruhi area atau elemen tertentu, seperti karakter yang dipilih di editor teks atau lagu dalam daftar putar. Untuk alasan ini, sebaiknya atur cakupan akselerator keyboard untuk item menu konteks ke induk menu konteks.

Gunakan properti ScopeOwner untuk menentukan cakupan akselerator keyboard. Kode ini menunjukkan cara mengimplementasikan menu konteks pada ListView dengan akselerator keyboard terlingkup:

<ListView x:Name="MyList">
  <ListView.ContextFlyout>
    <MenuFlyout>
      <MenuFlyoutItem Text="Share" Icon="Share"/>
      <MenuFlyoutItem Text="Copy" Icon="Copy">
        <MenuFlyoutItem.KeyboardAccelerators>
          <KeyboardAccelerator 
            Modifiers="Control" 
            Key="C" 
            ScopeOwner="{x:Bind MyList }" />
        </MenuFlyoutItem.KeyboardAccelerators>
      </MenuFlyoutItem>
      
      <MenuFlyoutItem Text="Delete" Icon="Delete" />
      <MenuFlyoutSeparator />
      
      <MenuFlyoutItem Text="Rename">
        <MenuFlyoutItem.KeyboardAccelerators>
          <KeyboardAccelerator 
            Modifiers="None" 
            Key="F2" 
            ScopeOwner="{x:Bind MyList}" />
        </MenuFlyoutItem.KeyboardAccelerators>
      </MenuFlyoutItem>
      
      <MenuFlyoutItem Text="Select" />
    </MenuFlyout>
    
  </ListView.ContextFlyout>
    
  <ListViewItem>Track 1</ListViewItem>
  <ListViewItem>Alternative Track 1</ListViewItem>

</ListView>

Atribut ScopeOwner dari elemen MenuFlyoutItem.KeyboardAccelerators menandai akselerator sebagai tercakup alih-alih global (defaultnya null, atau global). Untuk detail selengkapnya, lihat bagian Mengatasi akselerator nanti dalam topik ini.

Memanggil akselerator keyboard

Objek KeyboardAccelerator menggunakan pola kontrol UI Automation (UIA) untuk mengambil tindakan ketika akselerator dipanggil.

UIA [pola kontrol] mengekspos fungsionalitas kontrol umum. Misalnya, kontrol Tombol mengimplementasikan pola Kontrol pemanggilan untuk mendukung peristiwa Klik (biasanya kontrol dipanggil dengan mengklik, mengklik dua kali, atau menekan Enter, pintasan keyboard yang telah ditentukan sebelumnya, atau beberapa kombinasi penekanan tombol lainnya). Ketika akselerator keyboard digunakan untuk memanggil kontrol, kerangka kerja XAML mencari apakah kontrol mengimplementasikan pola kontrol Panggil dan, jika demikian, mengaktifkannya (tidak perlu mendengarkan peristiwa KeyboardAcceleratorInvoked).

Dalam contoh berikut, Control+S memicu peristiwa Klik karena tombol mengimplementasikan pola Panggil.

<Button Content="Save" Click="OnSave">
  <Button.KeyboardAccelerators>
    <KeyboardAccelerator Key="S" Modifiers="Control" />
  </Button.KeyboardAccelerators>
</Button>

Jika elemen menerapkan beberapa pola kontrol, hanya satu yang dapat diaktifkan melalui akselerator. Pola kontrol diprioritaskan sebagai berikut:

  1. Panggil (Tombol)
  2. Alihkan (Kotak Centang)
  3. Pilihan (ListView)
  4. Perluas/Ciutkan (Kotak Kombo)

Jika tidak ada kecocokan yang diidentifikasi, akselerator tidak valid dan pesan debug disediakan ("Tidak ada pola otomatisasi untuk komponen ini yang ditemukan. Terapkan semua perilaku yang diinginkan dalam peristiwa yang dipanggil. Pengaturan Ditangani ke true di penanganan aktivitas Anda menekan pesan ini.")

Perilaku akselerator keyboard kustom

Peristiwa yang dipanggil dari objek KeyboardAccelerator diaktifkan saat akselerator dijalankan. Objek peristiwa KeyboardAcceleratorInvokedEventArgs menyertakan properti berikut:

  • Ditangani (Boolean): Mengatur ini ke true mencegah peristiwa memicu pola kontrol dan menghentikan gelembung peristiwa akselerator. Defaultnya adalah false.
  • Elemen (DependencyObject): Objek yang terkait dengan akselerator.
  • KeyboardAccelerator: Akselerator keyboard yang digunakan untuk menaikkan peristiwa yang Dipanggil.

Di sini kami menunjukkan cara menentukan koleksi akselerator keyboard untuk item dalam ListView, dan cara menangani peristiwa yang Dipanggil untuk setiap akselerator.

<ListView x:Name="MyListView">
  <ListView.KeyboardAccelerators>
    <KeyboardAccelerator Key="A" Modifiers="Control,Shift" Invoked="SelectAllInvoked" />
    <KeyboardAccelerator Key="F5" Invoked="RefreshInvoked"  />
  </ListView.KeyboardAccelerators>
</ListView>
void SelectAllInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
  MyListView.SelectAll();
  args.Handled = true;
}

void RefreshInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
  MyListView.SelectionMode = ListViewSelectionMode.None;
  MyListView.SelectionMode = ListViewSelectionMode.Multiple;
  args.Handled = true;
}

Mengesampingkan perilaku keyboard default

Beberapa kontrol, ketika mereka memiliki fokus, mendukung akselerator keyboard bawaan yang menggantikan akselerator yang ditentukan aplikasi. Misalnya, ketika TextBox memiliki fokus, akselerator Control+C hanya menyalin teks yang saat ini dipilih (akselerator yang ditentukan aplikasi diabaikan dan tidak ada fungsionalitas lain yang dijalankan).

Meskipun kami tidak merekomendasikan penggantian perilaku kontrol default karena keakraban dan harapan pengguna, Anda dapat mengambil alih akselerator keyboard bawaan kontrol. Contoh berikut menunjukkan cara mengambil alih akselerator keyboard Control+C untuk TextBox melalui penanganan aktivitas PreviewKeyDown :

 private void TextBlock_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
 {
    var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(Windows.System.VirtualKey.Control);
    var isCtrlDown = ctrlState == CoreVirtualKeyStates.Down || ctrlState 
        ==  (CoreVirtualKeyStates.Down | CoreVirtualKeyStates.Locked);
    if (isCtrlDown && e.Key == Windows.System.VirtualKey.C)
    {
        // Your custom keyboard accelerator behavior.
        
        e.Handled = true;
    }
 }

Menonaktifkan akselerator keyboard

Jika kontrol dinonaktifkan, akselerator terkait juga dinonaktifkan. Dalam contoh berikut, karena properti IsEnabled dari ListView diatur ke false, akselerator Control+A terkait tidak dapat dipanggil.

<ListView >
  <ListView.KeyboardAccelerators>
    <KeyboardAccelerator Key="A"
      Modifiers="Control"
      Invoked="CustomListViewSelecAllInvoked" />
  </ListView.KeyboardAccelerators>
  
  <TextBox>
    <TextBox.KeyboardAccelerators>
      <KeyboardAccelerator 
        Key="A" 
        Modifiers="Control" 
        Invoked="CustomTextSelecAllInvoked" 
        IsEnabled="False" />
    </TextBox.KeyboardAccelerators>
  </TextBox>

<ListView>

Kontrol induk dan turunan dapat berbagi akselerator yang sama. Dalam hal ini, kontrol induk dapat dipanggil bahkan jika anak memiliki fokus dan akseleratornya dinonaktifkan.

Pembaca layar dan akselerator keyboard

Pembaca layar seperti Narator dapat mengumumkan kombinasi tombol akselerator keyboard kepada pengguna. Secara default, ini adalah setiap pengubah (dalam urutan enum VirtualModifiers) diikuti oleh kunci (dan dipisahkan oleh tanda "+"). Anda dapat menyesuaikan ini melalui properti terlampir AkseleratorKey AutomationProperties. Jika lebih dari satu akselerator ditentukan, hanya yang pertama yang diumumkan.

Dalam contoh ini, AutomationProperty.AcceleratorKey mengembalikan string "Control+Shift+A":

<ListView x:Name="MyListView">
  <ListView.KeyboardAccelerators>

    <KeyboardAccelerator 
      Key="A" 
      Modifiers="Control,Shift" 
      Invoked="CustomSelectAllInvoked" />
      
    <KeyboardAccelerator 
      Key="F5" 
      Modifiers="None" 
      Invoked="RefreshInvoked" />

  </ListView.KeyboardAccelerators>

</ListView>   

Catatan

Mengatur AutomationProperties.AcceleratorKey tidak mengaktifkan fungsionalitas keyboard, itu hanya menunjukkan ke kerangka kerja UIA kunci mana yang digunakan.

Akselerator Keyboard Umum

Kami menyarankan agar Anda membuat akselerator keyboard konsisten di seluruh aplikasi Windows.

Pengguna harus menghafal akselerator keyboard dan mengharapkan hasil yang sama (atau serupa), tetapi ini mungkin tidak selalu dimungkinkan karena perbedaan fungsionalitas di seluruh aplikasi.

Mengedit Akselerator Keyboard Umum
Mulai mode pengeditan Ctrl + E
Memilih semua item dalam kontrol atau jendela yang difokuskan Ctrl + A
Cari dan ganti Ctrl + H
Batalkan Ctrl + Z
Kembalikan Ctrl + Y
Menghapus pilihan dan menyalinnya ke clipboard Ctrl +X
Menyalin pilihan ke clipboard Ctrl + C, Ctrl + Insert
Tempelkan isi clipboard Ctrl + V, Shift + Insert
Tempelkan isi papan klip (dengan opsi) Ctrl + Alt + V
Mengganti nama item F2
Menambahkan item baru Ctrl + N
Menambahkan item sekunder baru Ctrl + Shift + N
Hapus item terpilih (dengan urungkan) Del, Ctrl+D
Hapus item terpilih (tanpa urungkan) Shift + Del
Tebal Ctrl + B
Garis bawah Ctrl + U
Miring Ctrl + I
Navigasi
Menemukan konten dalam kontrol atau Jendela yang difokuskan Ctrl +F
Masuk ke hasil pencarian berikutnya F3
Tindakan Lain
Tambahkan favorit Ctrl + D
Refresh F5 atau Ctrl + R
Perbesar tampilan Ctrl + + +
Perkecil Ctrl + -
Perbesar tampilan default Ctrl + 0
Simpan Ctrl + S
Tutup Ctrl + W
Print Ctrl + P

Perhatikan bahwa beberapa kombinasi tidak valid untuk versi Windows yang dilokalkan. Misalnya, dalam versi Bahasa Spanyol Windows, Ctrl+N digunakan untuk tebal alih-alih Ctrl+B. Sebaiknya sediakan akselerator keyboard yang dilokalkan jika aplikasi dilokalkan.

Kegunaan untuk akselerator keyboard

Tooltip

Karena akselerator keyboard biasanya tidak dijelaskan langsung di UI aplikasi Windows Anda, Anda dapat meningkatkan kemudahan penemuan melalui tipsalat, yang ditampilkan secara otomatis ketika pengguna memindahkan fokus ke, menekan dan menahan, atau mengarahkan penunjuk mouse ke kontrol. Tipsalat dapat mengidentifikasi apakah kontrol memiliki akselerator keyboard terkait dan, jika demikian, apa kombinasi tombol akseleratornya.

Windows 10, Versi 1803 (Pembaruan April 2018) dan yang lebih baru

Secara default, ketika akselerator keyboard dideklarasikan, semua kontrol (kecuali MenuFlyoutItem dan ToggleMenuFlyoutItem) menyajikan kombinasi tombol yang sesuai dalam tipsalat.

Catatan

Jika kontrol memiliki lebih dari satu akselerator yang ditentukan, hanya yang pertama yang disajikan.

Screenshot of a Save button with a tool tip above it that indicates support for the Ctrl+S accelerator.
Kombo kunci akselerator dalam tipsalat

Untuk objek Tombol, AppBarButton, dan AppBarToggleButton , akselerator keyboard ditambahkan ke tipsalat default kontrol. Untuk objek MenuFlyoutItem dan ToggleMenuFlyoutItem , akselerator keyboard ditampilkan dengan teks flyout.

Catatan

Menentukan tipsalat (lihat Tombol1 dalam contoh berikut) mengambil alih perilaku ini.

<StackPanel x:Name="Container" Grid.Row="0" Background="AliceBlue">
    <Button Content="Button1" Margin="20"
            Click="OnSave" 
            KeyboardAcceleratorPlacementMode="Auto" 
            ToolTipService.ToolTip="Tooltip">
        <Button.KeyboardAccelerators>
            <KeyboardAccelerator  Key="A" Modifiers="Windows"/>
        </Button.KeyboardAccelerators>
    </Button>
    <Button Content="Button2"  Margin="20"
            Click="OnSave" 
            KeyboardAcceleratorPlacementMode="Auto">
        <Button.KeyboardAccelerators>
            <KeyboardAccelerator  Key="B" Modifiers="Windows"/>
        </Button.KeyboardAccelerators>
    </Button>
    <Button Content="Button3"  Margin="20"
            Click="OnSave" 
            KeyboardAcceleratorPlacementMode="Auto">
        <Button.KeyboardAccelerators>
            <KeyboardAccelerator  Key="C" Modifiers="Windows"/>
        </Button.KeyboardAccelerators>
    </Button>
</StackPanel>

Screenshot of three buttons labeled Button1, Button2, and Button3 with a tool tip above Button2 that indicates support for the Windows+B accelerator.

Kombo kunci akselerator ditambahkan ke tipsalat default Tombol

<AppBarButton Icon="Save" Label="Save">
    <AppBarButton.KeyboardAccelerators>
        <KeyboardAccelerator Key="S" Modifiers="Control"/>
    </AppBarButton.KeyboardAccelerators>
</AppBarButton>

Screenshot of a button with a Disk icon and a tool tip that includes the default Save text appended with the Ctrl+S accelerator in parentheses.

Kombo kunci akselerator ditambahkan ke tipsalat default AppBarButton

<AppBarButton AccessKey="R" Icon="Refresh" Label="Refresh" IsAccessKeyScope="True">
    <AppBarButton.Flyout>
        <MenuFlyout>
            <MenuFlyoutItem AccessKey="A" Icon="Refresh" Text="Refresh A">
                <MenuFlyoutItem.KeyboardAccelerators>
                    <KeyboardAccelerator Key="R" Modifiers="Control"/>
                </MenuFlyoutItem.KeyboardAccelerators>
            </MenuFlyoutItem>
            <MenuFlyoutItem AccessKey="B" Icon="Globe" Text="Refresh B" />
            <MenuFlyoutItem AccessKey="C" Icon="Globe" Text="Refresh C" />
            <MenuFlyoutItem AccessKey="D" Icon="Globe" Text="Refresh D" />
            <ToggleMenuFlyoutItem AccessKey="E" Icon="Globe" Text="ToggleMe">
                <MenuFlyoutItem.KeyboardAccelerators>
                    <KeyboardAccelerator Key="Q" Modifiers="Control"/>
                </MenuFlyoutItem.KeyboardAccelerators>
            </ToggleMenuFlyoutItem>
        </MenuFlyout>
    </AppBarButton.Flyout>
</AppBarButton>

Screenshot of a Menu with MenuFlyoutItems that include accelerator key combos.
Kombo kunci akselerator ditambahkan ke teks MenuFlyoutItem

Kontrol perilaku presentasi dengan menggunakan properti KeyboardAcceleratorPlacementMode , yang menerima dua nilai: Otomatis atau Tersembunyi.

<Button Content="Save" Click="OnSave" KeyboardAcceleratorPlacementMode="Auto">
    <Button.KeyboardAccelerators>
        <KeyboardAccelerator Key="S" Modifiers="Control" />
    </Button.KeyboardAccelerators>
</Button>

Dalam beberapa kasus, Anda mungkin perlu menyajikan tipsalat yang relatif terhadap elemen lain (biasanya objek kontainer).

Di sini, kami menunjukkan cara menggunakan properti KeyboardAcceleratorPlacementTarget untuk menampilkan kombinasi tombol akselerator keyboard untuk tombol Simpan dengan kontainer Grid alih-alih tombol.

<Grid x:Name="Container" Padding="30">
  <Button Content="Save"
    Click="OnSave"
    KeyboardAcceleratorPlacementMode="Auto"
    KeyboardAcceleratorPlacementTarget="{x:Bind Container}">
    <Button.KeyboardAccelerators>
      <KeyboardAccelerator  Key="S" Modifiers="Control" />
    </Button.KeyboardAccelerators>
  </Button>
</Grid>

Label

Dalam beberapa kasus, sebaiknya gunakan label kontrol untuk mengidentifikasi apakah kontrol memiliki akselerator keyboard terkait dan, jika demikian, apa kombinasi tombol akseleratornya.

Beberapa kontrol platform melakukan ini secara default, khususnya objek MenuFlyoutItem dan ToggleMenuFlyoutItem , sementara AppBarButton dan AppBarToggleButton melakukannya saat muncul di menu luapan CommandBar.

Keyboard accelerators described in a menu item label.
Akselerator keyboard yang dijelaskan dalam label item menu

Anda dapat mengganti teks akselerator default untuk label melalui properti KeyboardAcceleratorTextOverride dari kontrol MenuFlyoutItem, ToggleMenuFlyoutItem, AppBarButton, dan AppBarToggleButton (gunakan spasi tunggal tanpa teks).

Catatan

Teks penimpaan tidak disajikan jika sistem tidak dapat mendeteksi keyboard yang terpasang (Anda dapat memeriksanya sendiri melalui properti KeyboardPresent ).

Konsep Tingkat Lanjut

Di sini, kami meninjau beberapa aspek akselerator keyboard tingkat rendah.

Prioritas peristiwa input

Peristiwa input terjadi dalam urutan tertentu yang dapat Anda cegat dan tangani berdasarkan persyaratan aplikasi Anda.

Peristiwa gelembung KeyDown/KeyUp

Di XAML, penekanan tombol diproses seolah-olah hanya ada satu alur gelembung input. Alur input ini digunakan oleh peristiwa KeyDown/KeyUp dan input karakter. Misalnya, jika elemen memiliki fokus dan pengguna menekan tombol ke bawah, peristiwa KeyDown dinaikkan pada elemen , diikuti oleh induk elemen, dan sebagainya di atas pohon, hingga arg. Properti yang ditangani benar.

Peristiwa KeyDown juga digunakan oleh beberapa kontrol untuk mengimplementasikan akselerator kontrol bawaan. Ketika kontrol memiliki akselerator keyboard, kontrol menangani peristiwa KeyDown, yang berarti bahwa tidak akan ada peristiwa KeyDown yang menggelegak. Misalnya, RichEditBox mendukung penyalinan dengan Ctrl+C. Ketika Ctrl ditekan, peristiwa KeyDown diaktifkan dan gelembung, tetapi ketika pengguna menekan C pada saat yang sama, peristiwa KeyDown ditandai Ditangani dan tidak dinaikkan (kecuali parameter handledEventsToo dari UIElement.AddHandler diatur ke true).

Peristiwa CharacterReceived

Saat peristiwa CharacterReceived diaktifkan setelah peristiwa KeyDown untuk kontrol teks seperti TextBox, Anda dapat membatalkan input karakter di penanganan aktivitas KeyDown.

Peristiwa PreviewKeyDown dan PreviewKeyUp

Peristiwa input pratinjau diaktifkan sebelum peristiwa lainnya. Jika Anda tidak menangani peristiwa ini, akselerator untuk elemen yang memiliki fokus diaktifkan, diikuti oleh peristiwa KeyDown. Kedua peristiwa gelembung sampai ditangani.

Diagram showing the key event sequenceUrutan peristiwa kunci

Urutan peristiwa:

Pratinjau peristiwa KeyDown
...
Akselerator aplikasi
Metode OnKeyDown
Peristiwa KeyDown
Akselerator aplikasi pada induk
Metode OnKeyDown pada induk
Peristiwa KeyDown pada induk
(Gelembung ke akar)
...
Peristiwa CharacterReceived
Peristiwa PreviewKeyUp
KeyUpEvents

Saat peristiwa akselerator ditangani, peristiwa KeyDown juga ditandai sebagai ditangani. Peristiwa KeyUp tetap tidak tertangani.

Menyelesaikan akselerator

Gelembung peristiwa akselerator keyboard dari elemen yang memiliki fokus hingga akar. Jika peristiwa tidak ditangani, kerangka kerja XAML mencari akselerator aplikasi lain yang tidak terlingkup di luar jalur gelembung.

Ketika dua akselerator keyboard didefinisikan dengan kombinasi tombol yang sama, akselerator keyboard pertama yang ditemukan di pohon visual dipanggil.

Akselerator keyboard terlingkup hanya dipanggil saat fokus berada di dalam cakupan tertentu. Misalnya, dalam Grid yang berisi puluhan kontrol, akselerator keyboard dapat dipanggil untuk kontrol hanya ketika fokus berada dalam Grid (pemilik cakupan).

Akselerator cakupan secara terprogram

Metode UIElement.TryInvokeKeyboardAccelerator memanggil akselerator yang cocok dalam subtree elemen.

Metode UIElement.OnProcessKeyboardAccelerators dijalankan sebelum akselerator keyboard. Metode ini meneruskan objek ProcessKeyboardAcceleratorArgs yang berisi kunci, pengubah, dan Boolean yang menunjukkan apakah akselerator keyboard ditangani. Jika ditandai sebagai ditangani, gelembung akselerator keyboard (sehingga akselerator keyboard luar tidak pernah dipanggil).

Catatan

OnProcessKeyboardAccelerators selalu diaktifkan, baik ditangani maupun tidak (mirip dengan peristiwa OnKeyDown). Anda harus memeriksa apakah peristiwa ditandai sebagai ditangani.

Dalam contoh ini, kami menggunakan OnProcessKeyboardAccelerators dan TryInvokeKeyboardAccelerator untuk cakupan akselerator keyboard ke objek Halaman:

protected override void OnProcessKeyboardAccelerators(
  ProcessKeyboardAcceleratorArgs args)
{
  if(args.Handled != true)
  {
    this.TryInvokeKeyboardAccelerator(args);
    args.Handled = true;
  }
}

Melokalisasi akselerator

Sebaiknya lokalkan semua akselerator keyboard. Anda dapat melakukan ini dengan file sumber daya standar (.resw) dan atribut x:Uid dalam deklarasi XAML Anda. Dalam contoh ini, Windows Runtime secara otomatis memuat sumber daya.

Diagram of keyboard accelerator localization with the resources filePelokalan akselerator keyboard dengan file sumber daya

<Button x:Uid="myButton" Click="OnSave">
  <Button.KeyboardAccelerators>
    <KeyboardAccelerator x:Uid="myKeyAccelerator" Modifiers="Control"/>
  </Button.KeyboardAccelerators>
</Button>

Catatan

Akselerator keyboard diimplementasikan sebagai tombol virtual. Akselerator yang dilokalkan harus dipilih dari koleksi kode Virtual-Key yang telah ditentukan sebelumnya (jika tidak, kesalahan pengurai XAML akan terjadi).

Menyiapkan akselerator secara terprogram

Berikut adalah contoh penentuan akselerator secara terprogram:

void AddAccelerator(
  VirtualKeyModifiers keyModifiers, 
  VirtualKey key, 
  TypedEventHandler<KeyboardAccelerator, KeyboardAcceleratorInvokedEventArgs> handler )
  {
    var accelerator = 
      new KeyboardAccelerator() 
      { 
        Modifiers = keyModifiers, Key = key
      };
    accelerator.Invoked += handler;
    this.KeyboardAccelerators.Add(accelerator);
  }

Catatan

KeyboardAccelerator tidak dapat dibagikan, KeyboardAccelerator yang sama tidak dapat ditambahkan ke beberapa elemen.

Mengesampingkan perilaku akselerator keyboard

Anda dapat menangani peristiwa KeyboardAccelerator.Invoked untuk mengambil alih perilaku KeyboardAccelerator default.

Contoh ini menunjukkan cara mengambil alih perintah "Pilih semua" (Akselerator keyboard Ctrl+A) dalam kontrol ListView kustom. Kami juga mengatur properti Ditangani ke true untuk menghentikan peristiwa yang menggelegak lebih lanjut.

public class MyListView : ListView
{
  …
  protected override void OnKeyboardAcceleratorInvoked(KeyboardAcceleratorInvokedEventArgs args) 
  {
    if(args.Accelerator.Key == VirtualKey.A 
      && args.Accelerator.Modifiers == KeyboardModifiers.Control)
    {
      CustomSelectAll(TypeOfSelection.OnlyNumbers); 
      args.Handled = true;
    }
  }
  …
}

Sampel