一部の入力バインディングが機能し、一部が機能しない理由は、TextBox コントロールが一部のキー バインディングをキャッチして処理するためです。たとえば、貼り付け用の+ 、テキストの先頭に移動するためのCTRL+などを処理します。一方、 +などの他のキーの組み合わせは、TextBox によって処理されないため、バブルアップします。VCTRLHomeCTRLF3
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>
お役に立てれば。