Chociaż najlepsze odpowiedzi są poprawne, osobiście lubię pracować z dołączonymi właściwościami, aby umożliwić zastosowanie rozwiązania do dowolnego UIElement
, zwłaszcza gdy Window
nie jest świadomy elementu, na którym należy się skupić. Z mojego doświadczenia wynika, że często widzę kompozycję kilku modeli widoku i kontrolek użytkownika, w których okno jest często niczym więcej niż kontenerem głównym.
Skrawek
public sealed class AttachedProperties
{
[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);
}
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)
{
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
{
var command = new FocusElementCommand(element);
window.InputBindings.Add(new InputBinding(command, gesture));
}
}
}
Dzięki tej dołączonej właściwości możesz zdefiniować skrót fokusu dla dowolnego elementu UIElement. Automatycznie zarejestruje powiązanie wejściowe w oknie zawierającym element.
Użycie (XAML)
<TextBox x:Name="SearchTextBox"
Text={Binding Path=SearchText}
local:AttachedProperties.FocusShortcutKey="Ctrl+Q"/>
Kod źródłowy
Pełny przykład, w tym implementacja FocusElementCommand, jest dostępny jako gist: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Zastrzeżenie: Możesz używać tego kodu wszędzie i bezpłatnie. Należy pamiętać, że jest to próbka, która nie nadaje się do intensywnego użytkowania. Na przykład nie ma wyrzucania elementów bezużytecznych, ponieważ Polecenie będzie przechowywać silne odwołanie do elementu.