Mặc dù các câu trả lời hàng đầu là chính xác, cá nhân tôi thích làm việc với các thuộc tính đính kèm để cho phép áp dụng giải pháp cho bất kỳ UIElement
, đặc biệt là khi Window
không nhận thức được yếu tố cần tập trung. Theo kinh nghiệm của tôi, tôi thường thấy một bố cục của một số mô hình xem và điều khiển người dùng, trong đó cửa sổ thường không có gì khác là thùng chứa gốc.
Đoạn trích
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));
}
}
}
Với thuộc tính đính kèm này, bạn có thể xác định lối tắt tiêu điểm cho bất kỳ UIE bổ sung nào. Nó sẽ tự động đăng ký ràng buộc đầu vào tại cửa sổ có chứa phần tử.
Cách sử dụng (XAML)
<TextBox x:Name="SearchTextBox"
Text={Binding Path=SearchText}
local:AttachedProperties.FocusShortcutKey="Ctrl+Q"/>
Mã nguồn
Mẫu đầy đủ bao gồm triển khai FocusEuityCommand có sẵn dưới dạng ý chính: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Tuyên bố miễn trừ trách nhiệm: Bạn có thể sử dụng mã này ở mọi nơi và miễn phí. Xin lưu ý rằng đây là mẫu không phù hợp để sử dụng nhiều. Ví dụ, không có bộ sưu tập rác của các phần tử bị xóa vì Lệnh sẽ giữ tham chiếu mạnh đến phần tử.