Powód, dla którego niektóre powiązania wejściowe działają, a niektóre nie, polega na tym, że kontrolka TextBox przechwytuje i obsługuje niektóre powiązania klawiszy. Na przykład, obsługuje CTRL + V do pasty, CTRL + Home aby jechać do początku tekstu, itp Inne kombinacje klawiszy takich jak CTRL + F3 drugiej strony aren 't obsługiwane przez TextBox, a więc będą się bańką.
Jeśli chcesz wyłączyć powiązanie wejściowe TextBox, byłoby to proste - można użyć polecenia ApplicationCommands.NotACommand
, które wyłączy domyślne zachowanie. Na przykład w poniższym przypadku wklejania z CTRL + V zostaną wyłączone:
<TextBox>
<TextBox.InputBindings>
<KeyBinding Key="V" Modifiers="Control" Command="ApplicationCommands.NotACommand" />
</TextBox.InputBindings>
</TextBox>
Jednak, dzięki czemu bańki do kontroli użytkownika jest nieco trudniejsze. Moją sugestią jest utworzenie powiązanego zachowania, które zostanie zastosowane do UserControl, zarejestrowanie się w jego zdarzeniu PreviewKeyDown
i wykonanie jego powiązań wejściowych w razie potrzeby, zanim dotrą one do TextBox. Da to pierwszeństwo kontroli UserControl po wykonaniu powiązań wejściowych.
Napisałem podstawowy problem, który osiąga tę funkcję, aby zacząć:
public class InputBindingsBehavior
{
public static readonly DependencyProperty TakesInputBindingPrecedenceProperty =
DependencyProperty.RegisterAttached("TakesInputBindingPrecedence", typeof(bool), typeof(InputBindingsBehavior), new UIPropertyMetadata(false, OnTakesInputBindingPrecedenceChanged));
public static bool GetTakesInputBindingPrecedence(UIElement obj)
{
return (bool)obj.GetValue(TakesInputBindingPrecedenceProperty);
}
public static void SetTakesInputBindingPrecedence(UIElement obj, bool value)
{
obj.SetValue(TakesInputBindingPrecedenceProperty, value);
}
private static void OnTakesInputBindingPrecedenceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((UIElement)d).PreviewKeyDown += new KeyEventHandler(InputBindingsBehavior_PreviewKeyDown);
}
private static void InputBindingsBehavior_PreviewKeyDown(object sender, KeyEventArgs e)
{
var uielement = (UIElement)sender;
var foundBinding = uielement.InputBindings
.OfType<KeyBinding>()
.FirstOrDefault(kb => kb.Key == e.Key && kb.Modifiers == e.KeyboardDevice.Modifiers);
if (foundBinding != null)
{
e.Handled = true;
if (foundBinding.Command.CanExecute(foundBinding.CommandParameter))
{
foundBinding.Command.Execute(foundBinding.CommandParameter);
}
}
}
}
Zastosowanie:
<UserControl local:InputBindingsBehavior.TakesInputBindingPrecedence="True">
<UserControl.InputBindings>
<KeyBinding Key="Home" Modifiers="Control" Command="{Binding MyCommand}" />
</UserControl.InputBindings>
<TextBox ... />
</UserControl>
Nadzieja to pomaga.
textbox znajduje się wewnątrz kontrolki użytkownika? –
@ DJ dokładnie. UserControl jest kontenerem i (w tym przykładzie) znajduje się w nim TextBox. Działa również dla ComboBox, DataGrid itp. –