我们有一个案例,我们有两个外部定义的RoutedUICommand
对象(即我们不拥有它们,因此我们无法更改它们),它们预先连接到相同的CTRL+N键绑定。我们可以在我们的代码中通过手动设置InputBindings
我们想要的来解决这个问题,就像这样(注意:AddMany
是我的便利扩展,它需要一个参数数组):
private void InitializeCommands(){
// Both NewFooCommand and NewLaaCommand define CTRL-N as their shortcut,
// so we have to explicitly assign the shortcuts we want for each
// Note: You should explicitly specify both as the system may 'choose' the wrong one to
// handle the default case. i.e. we can't just specify NewLaaCommand for the new shortcut
// because the system may also wire up CTRL+N to NewLaaCommand so it would now respond to
// both shortcuts while NewFooCommand now wouldn't respond to either.
InputBindings.AddMany(
new InputBinding(NewFooCommand, new KeyGesture(Key.N, ModifierKeys.Control)),
new InputBinding(NewLaaCommand, new KeyGesture(Key.N, ModifierKeys.Control | ModifierKeys.Alt))
);
CommandBindings.AddMany(
new CommandBinding(NewFooCommand, (s, e) => MessageBox.Show("New Foo!")),
new CommandBinding(NewLaaCommand, (s, e) => MessageBox.Show("New Laa!"))
);
}
这工作正常并解决了我们问题的这一部分,因此我们现在可以使用我们认为合适的快捷方式。
我们仍在尝试解决的问题是我们有全局样式的按钮,这些样式会自动应用它们的工具提示来显示它们分配的快捷键。它基于命令本身指定的内容,在这种情况下当然是CTRL+N所以这就是它们都显示的内容,即使现在是CTRL+ ALT+N感谢手动指定的InputBinding
.
现在虽然我们可以四处走动并对工具提示进行硬编码,但我想知道是否有一种方法可以代替询问命令它的绑定/绑定是什么,如果我们可以以某种方式查询系统以查看当前的键绑定相对于给定控件(即按钮)实际上是有效的。但是,我不确定如何获取该信息,而无需手动遍历InputBinding
特定的可视化树搜索集合RoutedUICommand
。
是否可以询问输入系统实际上是哪个键绑定,而不仅仅是在RoutedUICommand
?
一个“hack”替代方案是使用正确的键绑定定义我们自己的“镜像”命令,以便样式正确更新工具提示,然后我们只需将大多数操作委托给实际命令。就像我说的,这是一个 hack,但它会起作用。