我使用CommandManager.RegisterClassInputBinding将绑定添加到整个类型。现在我想删除它。
这是我测试过的。
private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e)
{
CommandManager.RegisterClassInputBinding(
typeof(TextBox),
new InputBinding(TestCommand, new KeyGesture(Key.S, ModifierKeys.Control)));
MessageBox.Show("CommandBinding_Executed_1");
}
在 Ctrl + H 上调用此方法,并为 Ctrl + S 注册新的输入绑定。如果我在 Ctrl + H 之前按 Ctrl + S 它不起作用,但是当我按下它之后确实如此。
我检查了sender.InputBindings
并且只有一个绑定( Ctrl + S )所以我得出结论RegisterClassInputBinding()
没有添加绑定到每个现有实例,但是存储与该类关联的绑定,然后将它们与处理过的手势进行比较。
但是为什么没有RemoveClassInputBinding()
方法呢? :(
修改
我甚至设法通过反思做了我想做的事情,但仍然无法找到原生方法,尽管实施起来很简单。
var fieldInfo = typeof(CommandManager).GetField(
"_classInputBindings", BindingFlags.Static | BindingFlags.NonPublic);
var fieldData = (HybridDictionary)fieldInfo.GetValue(null);
var inputBindingCollection = (InputBindingCollection)fieldData[typeof(TextBox)];
foreach (var o in inputBindingCollection)
{
if (o == inputBinding)
{
MessageBox.Show("half way there");
}
}
inputBindingCollection.Remove(inputBinding);
答案 0 :(得分:7)
ApplicationCommands.NotACommand就是为此而设计的:
“此命令始终被忽略,并且不处理导致它的输入事件。这提供了一种关闭内置于现有控件中的输入绑定的方法。”
使用您的示例:
CommandManager.RegisterClassInputBinding(
typeof(TextBox),
new InputBinding(
ApplicationCommands.NotACommand,
new KeyGesture(Key.S, ModifierKeys.Control)));