【发布时间】:2013-12-18 02:51:16
【问题描述】:
我有一个带有几个单行文本框和一个 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。
我尝试了以下 [丑陋] 解决方法:
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。
谢谢。
【问题讨论】:
-
尝试将
e.Handled设置为true。 -
谢谢,没有写我的问题,但我已经尝试过了,但没有成功。如果我在调用
myDataGrid.RaiseEvent(e)之前或之后设置e.Handled = true,则事件不会路由到DataGrid(甚至不会触发myDataGrid.PreviewKeyDown)。
标签: c# wpf datagrid childcontrol event-routing