【问题标题】:Adding "close tab" keybinding to WPF TabItem in C#在 C# 中向 WPF TabItem 添加“关闭选项卡”键绑定
【发布时间】:2014-04-29 06:37:00
【问题描述】:

我已经实现了这个修改后的 TabItem,为 WPF TabControl 的每个选项卡添加了一个“关闭”按钮:

http://www.codeproject.com/Articles/281402/Closable-TabItem-in-WPF

一切都很好,但我无法弄清楚如何为 Ctrl+W 添加 KeyBinding 作为关闭选项卡的替代方式。我尝试添加到 CloseTab.cs 类以及我的主窗口类,但没有成功。

我用这个作为参考:

Keyboard shortcuts in WPF

...但我不太明白如何添加快捷方式。

【问题讨论】:

    标签: c# wpf tabcontrol key-bindings


    【解决方案1】:

    我还没有真正测试过这个,但也许不是使用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 命令。您可能必须单击选项卡或选项卡区域以使其成为焦点,以便键绑定起作用。我在测试期间注意到了这一点。

    【讨论】:

    • 这可能是一个愚蠢的问题,但是当我在代码中动态创建选项卡时,如何将 Interaction.Triggers 添加到我的自定义 TabItem 中?
    • @ClairelyClaire - 试试我的 Edit2 看看是否适合你 :)
    • 感谢您的帮助!然而,RelayCommand 似乎并不存在。我发现似乎是 MSDN 关于 RelayCommmand 的文章中使用的类,但没有任何反应......
    • @ClairelyClaire 好的,看看 EDIT3 哈哈。
    • 谢谢!效果很好,而且只有一行代码,不少!我对 WPF 还是很陌生,所以非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2018-04-21
    • 2013-08-04
    • 2013-12-10
    相关资源
    最近更新 更多