【发布时间】:2015-10-14 19:06:32
【问题描述】:
首先:我知道实际上有成千上万的答案,例如:“将处理程序添加到Keyboard.KeyDownEvent 并玩得开心!”。但在我的情况下,这不起作用。
我有一个自定义控件CustomControl,它派生自Canvas,但没有Children。相反,它将其“孩子”直接吸引到OnRender 中的DrawingContext。我的控件是 HitTestVisible,它是制表位但不可聚焦。它经常被重复使用,有时在ScrollViewer 中。
CustomControl 有一个自定义实现,用于选择文本之类的内容,并且应该将所选文本复制到 Ctrl+C 上的剪贴板。
为此,我在构造函数中添加了一个处理程序:
public CustomControl()
{
//// ... other stuff
AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)CopyMarkedNucleotidesToClipboard);
}
问题是:当我的控件位于 ScrollViewer 内时,我按下 Ctrl+C,KeyDownEvent 会在 @987654333 上引发@ 并冒泡到窗口,因此永远不会到达我的控件。
我可以在我的CustomControl 中做什么来捕获它所在的窗口中的每个 Ctrl+C?
PS:我已经设置了IsTabStop="False"和Focusable="False"。但随后ScrollViewer 的下一个兄弟会引发仍然会冒泡到窗口的事件。而且我不想遍历视觉树中较高的所有控件并设置 IsTabStop="False" 和 Focusable="False" 这将是错误的......
我已经找到了这篇文章http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx,但我认为,一定有更类似于 wpf 的方式!
【问题讨论】:
-
表单中是否有“KeyPreview”事件?如果是,请尝试为该事件添加一个侦听器并在表单中处理 keydown 事件..
-
我可以在我的 CustomControl 中做什么来捕获我的应用程序中的每个 Ctrl+C - 建议您在应用程序级别捕获它并通知您的控件。您可能只有一个窗口(但将其称为应用程序),因此转发调用(命令?)以通过事件或其他方式进行控制应该是一种方式。
-
@User2012384:Preview 事件从窗口开始,在
ScrollViewer停止。所以它仍然没有达到我的控制。 -
@Sinatr:我不能(不想)遍历所有使用
CustomControl的地方,在窗口级别添加一个处理程序并将其转发给我的控件。我更喜欢CustomControl中的解决方案。这样我以后可以将组合键更改为 Ctrl+U ,而无需再次访问所有窗口... -
您可以让您的控件自动执行此操作。例如。在
Load事件中,它可以找到他的父窗口并订阅父窗口事件(可能直接按下,不确定,你所有的窗口都可以实现一些事件接口,控件将使用它来订阅)。
标签: c# wpf keyboard routed-events