C# 使用WPF中文本框的按键事件捕获Ctrl-X

C# 使用WPF中文本框的按键事件捕获Ctrl-X,c#,wpf,C#,Wpf,当用户使用键按下ctrl-x时,我试图触发一个事件。这对ctrl-D很有效,但按下ctrl-x时不会触发事件。我猜这是因为ctrl-x是“剪切”命令。当按下ctrl-X时,是否有方法触发事件 private void textBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyboardDevice.IsKeyDown(Key.LeftCtrl) || e.KeyboardDevice.IsKeyDown(Key.RightCtrl

当用户使用
键按下ctrl-x时,我试图触发一个事件。这对ctrl-D很有效,但按下ctrl-x时不会触发事件。我猜这是因为ctrl-x是“剪切”命令。当按下ctrl-X时,是否有方法触发事件

private void textBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyboardDevice.IsKeyDown(Key.LeftCtrl) || e.KeyboardDevice.IsKeyDown(Key.RightCtrl))
    {
        switch (e.Key)
        {
            case Key.D:
                //handle D key
                break;
            case Key.X:
                //handle X key
                break;
        }
    }
}

尝试在keydown事件中执行以下操作

       if (e.Control == true && e.KeyCode==keys.x)
       {
            e.Handled = true;
            textBox1.SelectionLength = 0;
            //Call your method
       }

可以替代现有的“剪切”命令:



您需要创建一个文件。

要在wpf中实现这一点,我尝试以下方法:

private void HandleKeyDownEvent(object sender, KeyEventArgs e)
{
    if (e.Key == Key.X && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
    {
        MessageBox.Show("You press Ctrl+X :)");
    }
}

我使用的方法是:

private void SomeWindow_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.X && (e.KeyboardDevice.Modifiers & ModifierKeys.Control) != 0)
    {
        //Ctrl + X is pressed
    }
}

大多数答案都完成了工作,但调试却很痛苦。由于先按CTRL键,因此应将其分隔开,以便跳过它,并且只有一个
如果
,才能对其进行检查。以下内容应高效且易于调试

public MyApp() {
    // other constructor code
    KeyDown += MyApp_KeyDown;    
}

private void MyApp_KeyDown(object sender, KeyEventArgs e) {
    // hold that CTRL key down all day... you'll never get in unless there's another key too. 
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key!=Key.LeftCtrl && e.Key != Key.RightCtrl) 
    {
        switch (e.Key) // <--- Put the BREAK here.  Stops iff there's another key too.
        {
            case Key.C: UndoRedoStack.InsertInUnDoRedoForCopy(CopyArgs); break;
            case Key.X: UndoRedoStack.InsertInUnDoRedoForCut(CutArgs); break;
            case Key.V: UndoRedoStack.InsertInUnDoRedoForPaste(PasteArgs); break;
            case Key.Y: UndoRedoStack.Redo(1); break;
            case Key.Z: UndoRedoStack.Undo(1); break;
            default: break;
        }
    }
}
publicmyapp(){
//其他构造函数代码
KeyDown+=MyApp\u KeyDown;
}
私有void MyApp_KeyDown(对象发送方,KeyEventArgs e){
//整天按住CTRL键……除非还有另一个键,否则你永远也进不去。
if(Keyboard.Modifiers==ModifierKeys.Control&&e.Key!=Key.LeftCtrl&&e.Key!=Key.RightCtrl)
{

开关(电子钥匙)//为什么不处理命令而不是事件?我该怎么做?有没有办法覆盖TextBox的“剪切”命令?我假设e对象是KeyEventArgs。它似乎没有控件或KeyCode属性。有关代码,请参见上面的编辑。事件将针对“ctrl”键触发,但在“x”键时不会触发按住“ctrl”键时被按下您在我发布答案后添加了wpf这就是为什么有些困惑谢谢,我无法在xaml中使用它(甚至为该命令创建了依赖性属性)但是它在代码隐藏中工作得很好。但是命令通常在viewmodel级别运行,而复制功能扩展到代码隐藏和viewmodel。事实上,如果允许对列重新排序,则在不违反MVVM的情况下,您无法从viewmodel中知道列的位置。@AgostinoX您需要将更多信息绑定到VM或如果不可能,请检查视图中的事件,然后将事件中的信息传递给VM命令或方法。另一方面,我发现自己想知道这是否是仅查看代码的情况。假设复制粘贴操作类似于手工编辑,为什么模型要知道它并将其作为不同的操作来处理ion?@AgostinoX当然,这取决于操作应该做什么。为什么要这样写:if(e.Key==Key.X&&(Keyboard.Modifiers&ModifierKeys.Control)==ModifierKeys.Control){}而不是if(e.Key==Key.X&(Keyboard.Modifiers==ModifierKeys.Control)){}?对我来说,它不在“if”语句中。知道为什么吗?@StepanIvanenko,因为修饰符是标志,如果有多个标志,则无法获得匹配。他使用二进制代码仅提取所需的控制标志。@GeorgiG这不是一个好主意,因为通常键绑定只应在精确匹配时触发,所以在本例中不适用于比如Ctrl+Alt+X。