为啥我的 WPF KeyDown 处理程序没有捕获 CTRL+A?

Posted

技术标签:

【中文标题】为啥我的 WPF KeyDown 处理程序没有捕获 CTRL+A?【英文标题】:Why is my WPF KeyDown handler not catching CTRL+A?为什么我的 WPF KeyDown 处理程序没有捕获 CTRL+A? 【发布时间】:2018-11-26 11:27:37 【问题描述】:

我有一个 ListView 和以下 KeyDown 事件处理程序:

private void ListViewOnKeyDown(object sender, KeyEventArgs e)

    if (e.Key == Key.A)
    
        Debug.WriteLine("KeyDown is A");
        if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
        
            ListViewHelper.SelectAll((ListView)sender);
        
    

然而,Debug.WriteLine 只会被调用,也就是说,如果我只按下键 A,我会在输出窗口中看到 KeyDown is A 。如果我按下CTRL,将调用事件,但e.Key 显示为LeftCtrl(使用断点),按住CTRL 并按下A,则不会调用Debug.WriteLine。使用断点进行调试表明,当我按住 CTRL 时,处理程序会继续为 LeftCtrl 调用。

【问题讨论】:

有人可以解释一下否决票吗?我发现许多搜索结果表明这是检测这种按键组合的方法,但它没有按预期工作。我还想知道这个问题在发布的那一刻是如何被否决的?是否有一些心胸狭窄的官僚坐等问题可能被否决? 能否请一些人解释一下如何以正确的名义,一个问题标记为 WPF 等。确切地问为什么我编写的与所有标签相关的代码可以正确地被选为“离题”? 【参考方案1】:

它不起作用,因为特殊组合已由 ListBox 控件处理。

使用PreviewKeyDown 似乎可行。 注意通过设置e.Handled = true;

【讨论】:

这不是ListBox,而是ListView,完全不同的控件,当我尝试使用它来选择ListView中的所有项目时,该组合键不起作用。 @ProfK 相当不同的控制? ListView 是从 ListBox 派生的,PreviewKeyDown 可以正常工作。你甚至都没试过,对吧? @ProfK 很抱歉这个错误,它也应该与 ListView 一样工作。 @Clemens 对于我的 WPF 知识和我使用它们的方式,它们是完全不同的。 PreviewKeyDown 与您的评论无关,因为我指的是 ListView 没有响应 CTRL+A,不是说 PreviewKeyDown 在尝试之前不起作用。我的评论是在昨天结束时发表的,同时我做了笔记尝试PreviewKeyDown。但是感谢您提供有关控件如何相关的信息。 @Liuk 说组合键已经由 ListBox 类处理并没有错,因为它是 ListView 的基类。因此,组合键也由 ListView 隐式处理。

以上是关于为啥我的 WPF KeyDown 处理程序没有捕获 CTRL+A?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中捕获 Ctrl + Tab 和 Ctrl + Shift + Tab?

在我的 WPF 应用程序中捕获没有焦点的按键事件

如何阻止 WPF KeyDown 事件从某些包含的控件(例如 TextBox)冒泡?

WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例

对话框捕获WM_KEYDOWN消息

WPF捕获全局未处理异常