【问题标题】:Creating a Keyboard Chord Which Overrides a Default Action (CTRL-V)创建覆盖默认操作的键盘和弦 (CTRL-V)
【发布时间】:2021-12-08 03:27:07
【问题描述】:

我的目标是复制 Visual Studio 编辑器中的键盘和弦组合 Ctrl+E+V 复制该行。 需要明确的是,这不是如何复制一行的问题,而是处理 WPF 中的键盘和弦场景。

和弦怎么能在哪里完成

  • CtrlV 独立的不会触发自定义行复制命令,只是在 E时不被处理 > 没有伴随它。
    • AKA 回退到系统进行粘贴。
    • 这不是交易破坏者,如果是这样,我可以处理剪贴板。

我试过了

<KeyBinding Gesture="Ctrl+E" Command="{Binding cmdSetChord_E}"/>
<KeyBinding Gesture="Ctrl+V" Command="{Binding cmdDuplicateCurrent}"/>

和

bool ePressed;

private void tbPatternDesign_KeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.E)
        ePressed = e.Handled = true;

    if (ePressed && Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.V)
    {
        MessageBox.Show("Duplicate");
        e.Handled = true;
        ePressed = false;
    }
}

无济于事。

【问题讨论】:

    标签: c# wpf .net-6.0


    【解决方案1】:

    您可以使用CommandBinding 覆盖控件的默认命令实现。这是一个带有TextBox 的示例。

    <TextBox>
        <TextBox.CommandBindings>
            <CommandBinding Command="ApplicationCommands.Paste" Executed="CommandBinding_Executed"/>
            <CommandBinding Command="EditingCommands.AlignCenter" Executed="CommandBinding_Executed"/>
        </TextBox.CommandBindings>
        <TextBox.InputBindings>
            <KeyBinding Command="EditingCommands.AlignCenter" Gesture="CTRL+E"/>
        </TextBox.InputBindings>
    </TextBox>
    
        bool ePressed;
    
        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            switch (((RoutedUICommand)e.Command).Text)
            {
                case "Paste":
                    if (ePressed)
                    {
                        MessageBox.Show("Duplicate");
                        ePressed = false; 
                    }
                    else
                        ((TextBox)sender).Paste();
                    break;
                case "AlignCenter":
                    ePressed = true;
                    break;
            }
        }
    

    【讨论】:

    • 另一方面,我的TextBox 不支持AlignCenter,我必须在 Keypress down 中捕获第一个和弦 (E),然后使用您的粘贴覆盖。
    【解决方案2】:

    怎么样:

    Keyboard.IsKeyDown(Key.E) && Keyboard.IsKeyDown(Key.V) && ...
    

    【讨论】:

    • E 和 V 不会同时执行。但是,控制权仍然会为两者保留。但是键盘和弦(不是我的名字)只是表示一系列键盘动作,不一定根据键的类型同时执行。作为触摸打字机,我不会用左手敲两个键,每个键都是单独的;除了按住 Ctrl 键。
    【解决方案3】:

    尝试使用

    Console.readkey()
    

    这可能不是最直观的方法,但它是一个很好的当前解决方案。

    【讨论】:

    • 这就是订阅事件 KeyDown 在 WPF 中所做的事情。
    • 此解决方案绝不适用于 WPF。
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多