我使用CommandManager.RegisterClassInputBinding向整个类添加绑定。现在我想要删除它。
这是我测试过的内容。
该方法在按下Ctrl+H时调用,并为Ctrl+S注册新的输入绑定。如果我先按下Ctrl+S,再按下Ctrl+H,它将不起作用,但是如果我先按下Ctrl+H,再按下Ctrl+S,它就可以工作了。
我检查了
但是为什么没有
我甚至通过反射成功实现了我的目标,但仍然找不到本地方法,虽然实现这个方法很简单。
这是我测试过的内容。
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+S,再按下Ctrl+H,它将不起作用,但是如果我先按下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);