【问题标题】:Capture KeyDown when event does not reach my control当事件未达到我的控制时捕获 KeyDown
【发布时间】: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+CKeyDownEvent 会在 @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


【解决方案1】:

Sinatr 的建议是正确的!谢谢!

解决办法是在load中找到父窗口,订阅他的KeyDownEvent

public CustonControl()
{
    Loaded += HookToCtrlC;
}

private void HookToCtrlC(object sender, EventArgs e)
{
    var parentWindow = Window.GetWindow(this);
    parentWindow.KeyDown += CopySelectedTextToClipboard;
}

private void CopyMarkedNucleotidesToClipboard(object sender, KeyEventArgs e)
{
    Clipboard.SetText("Hello World!");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多