我有一个带有几个单行文本框和一个 DataGrid 的窗口(Windows8 上的 .Net 4.5)。
我想将导航事件(Up/Down/PgUp/PgDn 等)路由到网格,无论哪个控件具有焦点。
我尝试在主窗口中覆盖 PreviewKeyDown,如下所示:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Up:
case Key.Down:
myDataGrid.RaiseEvent(e);
break;
}
}
问题是我得到了 StackOverflowException 因为事件不断反映到Window_PreviewKeyDown
.
我尝试了以下 [ugly] 解决方法:
bool bEventRaised = false;
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if ( bEventRaised )
{
bEventRaised = false;
return;
}
switch (e.Key)
{
case Key.Up:
case Key.Down:
bEventRaised = true;
myDataGrid.RaiseEvent(e);
break;
}
}
我宁愿用 替换if ( bEventRaised )
,if ( sender == myDataGrid )
但是,发件人始终是主窗口。
尽管如此,这让我更进一步。我现在可以看到键盘事件到达myDataGrid.PreviewKeyDown
,但仍然 - 该事件不会在 myDataGrid 中触发。
我很想得到一些帮助来理解我做错了什么,或者是否有不同的方式将事件路由到子 DataGrid。
谢谢。