为啥我的 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 KeyDown 事件从某些包含的控件(例如 TextBox)冒泡?