Meskipun jawaban teratas sudah benar, saya pribadi suka bekerja dengan properti terlampir untuk memungkinkan solusi diterapkan ke apa pun UIElement
, terutama ketika Window
tidak mengetahui elemen yang harus difokuskan. Dalam pengalaman saya, saya sering melihat komposisi beberapa model tampilan dan kontrol pengguna, di mana jendela sering tidak lebih dari wadah root.
Potongan
public sealed class AttachedProperties
{
// Define the key gesture type converter
[System.ComponentModel.TypeConverter(typeof(System.Windows.Input.KeyGestureConverter))]
public static KeyGesture GetFocusShortcut(DependencyObject dependencyObject)
{
return (KeyGesture)dependencyObject?.GetValue(FocusShortcutProperty);
}
public static void SetFocusShortcut(DependencyObject dependencyObject, KeyGesture value)
{
dependencyObject?.SetValue(FocusShortcutProperty, value);
}
/// <summary>
/// Enables window-wide focus shortcut for an <see cref="UIElement"/>.
/// </summary>
// Using a DependencyProperty as the backing store for FocusShortcut. This enables animation, styling, binding, etc...
public static readonly DependencyProperty FocusShortcutProperty =
DependencyProperty.RegisterAttached("FocusShortcut", typeof(KeyGesture), typeof(AttachedProperties), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.None, new PropertyChangedCallback(OnFocusShortcutChanged)));
private static void OnFocusShortcutChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is UIElement element) || e.NewValue == e.OldValue)
return;
var window = FindParentWindow(d);
if (window == null)
return;
var gesture = GetFocusShortcut(d);
if (gesture == null)
{
// Remove previous added input binding.
for (int i = 0; i < window.InputBindings.Count; i++)
{
if (window.InputBindings[i].Gesture == e.OldValue && window.InputBindings[i].Command is FocusElementCommand)
window.InputBindings.RemoveAt(i--);
}
}
else
{
// Add new input binding with the dedicated FocusElementCommand.
// see: https://gist.github.com/shuebner20/349d044ed5236a7f2568cb17f3ed713d
var command = new FocusElementCommand(element);
window.InputBindings.Add(new InputBinding(command, gesture));
}
}
}
Dengan properti terlampir ini, Anda dapat menentukan pintasan fokus untuk UIElement apa pun. Ini akan secara otomatis mendaftarkan pengikatan input di jendela yang mengandung elemen.
Penggunaan (XAML)
<TextBox x:Name="SearchTextBox"
Text={Binding Path=SearchText}
local:AttachedProperties.FocusShortcutKey="Ctrl+Q"/>
Kode sumber
Sampel lengkap termasuk implementasi FocusElementCommand tersedia sebagai inti: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Penafian: Anda dapat menggunakan kode ini di mana saja dan gratis. Harap diingat, bahwa ini adalah sampel yang tidak cocok untuk penggunaan berat. Misalnya, tidak ada pengumpulan sampah dari elemen yang dihapus karena Perintah akan memegang referensi kuat ke elemen.