某些输入绑定有效而某些无效的原因是 TextBox 控件捕获并处理了一些键绑定。例如,它处理CTRL+V用于粘贴,CTRL+Home用于转到文本的开头等。另一方面,其他组合键(例如CTRL+ F3)不由 TextBox 处理,因此它们会冒泡。
如果您只是想禁用 TextBox 的输入绑定,那很简单 - 您可以使用该ApplicationCommands.NotACommand
命令,该命令将禁用默认行为。例如,在以下情况下,使用CTRL+粘贴V将被禁用:
<TextBox>
<TextBox.InputBindings>
<KeyBinding Key="V" Modifiers="Control" Command="ApplicationCommands.NotACommand" />
</TextBox.InputBindings>
</TextBox>
然而,让它冒泡到用户控件有点棘手。我的建议是创建一个附加行为,该行为将应用于 UserControl,注册到它的PreviewKeyDown
事件,并在它们到达 TextBox 之前根据需要执行它的输入绑定。当执行输入绑定时,这将优先于 UserControl。
我编写了一个实现此功能的基本行为来帮助您入门:
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);
}
}
}
}
用法:
<UserControl local:InputBindingsBehavior.TakesInputBindingPrecedence="True">
<UserControl.InputBindings>
<KeyBinding Key="Home" Modifiers="Control" Command="{Binding MyCommand}" />
</UserControl.InputBindings>
<TextBox ... />
</UserControl>
希望这可以帮助。