首先:我知道有成千上万的答案,比如:"向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
在ScrollViewer
上凸起并向上冒泡到窗口,因此永远不会到达我的控件。
我能在我的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!");
}