当事件没有达到我的控制时捕获KeyDown



首先:我知道有成千上万的答案,比如:"向Keyboard.KeyDownEvent添加处理程序并玩得开心!"但在我的情况下,这不起作用。

我有一个自定义控件CustomControl,它派生自Canvas,但没有Children。相反,它将其"子"直接绘制到OnRender中的DrawingContext。我的控件是HitTestVisible,它是制表符,但不能聚焦。它经常被重用,有时在ScrollViewer中。

这个CustomControl有一个自定义实现,用于选择文本之类的东西,并且应该将选中的文本复制到剪贴板上的Ctrl+C

为此,我在构造函数中添加了一个处理程序:
public CustomControl()
{
    //// ... other stuff
    AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)CopyMarkedNucleotidesToClipboard);
}

这里是问题:当我的控件在ScrollViewer内时,我按Ctrl+CKeyDownEventScrollViewer上凸起并向上冒泡到窗口,因此永远不会到达我的控件。

我能在我的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的方式!

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

解决方案是在加载中找到父窗口并订阅他的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!");
}

最新更新