我还没有真正测试过这个,但也许不是使用InputGestures(因为我猜你无法让它工作),也许你可以绑定到一个命令并检查Keyboard当前按下钥匙?
所以在定义 ClosableTabItem 的 xaml 中:
(您需要添加对System.Windows.Interactivity 的引用)
xmlns:local="clr-namespace:TestDemo"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<local:ClosableTabItem Header="TabItem 1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<i:InvokeCommandAction Command="{Binding KeyDownCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</local:ClosableTabItem>
然后是命令:
private RelayCommand _KeyDownCommand;
public ICommand KeyDownCommand
{
get
{
if (this._KeyDownCommand == null)
this._KeyDownCommand = new RelayCommand(param => this.CheckKeysDown());
return this._KeyDownCommand;
}
}
以及方法:
private void CheckKeysDown()
{
if (Keyboard.IsKeyDown(Key.W) && ((Keyboard.Modifiers & ModifierKeys.Control) > 0))
{
// Ctrl + W was pressed
}
}
编辑:为了扩展我的答案,我发现这个非常有用的实现:
http://joyfulwpf.blogspot.com/2009/05/mvvm-commandreference-and-keybinding.html
您可以在上述链接的实现中使用CommandReference 在满足KeyBinding 时执行!
EDIT2:在后面的代码中执行此操作(用于动态添加的选项卡项):
System.Windows.Interactivity.EventTrigger trigger =
new System.Windows.Interactivity.EventTrigger();
trigger.EventName = "KeyDown";
System.Windows.Interactivity.InvokeCommandAction keyDownAction =
new System.Windows.Interactivity.InvokeCommandAction();
keyDownAction.Command = KeyDownCommand;
trigger.Actions.Add(keyDownAction);
trigger.Attach(yourTabItem);
EDIT3: 好的,我自己得到了代码,并尝试为你找出一个修复方法。 ClosableTabItem 类删除选项卡的方式是使用命令StateChange。我刚刚将KeyBinding 添加到我在后面的代码中创建的选项卡项中,它起作用了。
所以我这样做了:
ClosableTabItem myTab = new ClosableTabItem();
myTab.InputBindings.Add(new KeyBinding(ClosableTabItem.StateChange, Key.W, ModifierKeys.Control));
因此,当您动态创建选项卡时,请在上方添加此输入绑定并将其连接到 StateChange 命令。您可能必须单击选项卡或选项卡区域以使其成为焦点,以便键绑定起作用。我在测试期间注意到了这一点。