覆盖回车键,但保持wpf数据网格中其他键的默认行为

让我感到困扰的是,按下数据网格中的回车键会将选择项向下移动一个项目,我希望能够在正常的keydown事件中决定它的作用。

所以我所做的是创建一个新类,它inheritanceDataGrid并覆盖OnKeyDown事件并将其用作我的datagrid。

这会产生一系列全新的问题,因为我显然必须重写所有其他按键(箭头键导航,shift +箭头键选择,pgup / pgdn等等)。 我一直试图破解它,但只是花了很多时间来重写已经写好的东西并且可能比我想出的更好。

那么如何在不弄乱datagrid的其他默认键绑定的情况下让enter键执行我想要的操作呢?

提前致谢

只需检查按下的键是否输入,如果不是,则调用KeyDown的基本事件处理程序(类似于base.OnKeyDown(sender, args);

您需要将PreviewKeyDown处理程序绑定到Datagrid,然后手动检查键值是否为Key.Enter

如果是,请设置e.Handled = true

一个更简单的实现。 想法是捕获keydown事件,如果键是“Enter”,则决定你想要遍历的方向。
FocusNavigationDirection具有几个属性,可以根据这些属性修改焦点。

 ///  /// On Enter Key, it tabs to into next cell. ///  ///  ///  private void LiquidityInstrumentViewsGrid_OnPreviewKeyDown(object sender, KeyEventArgs e) { var uiElement = e.OriginalSource as UIElement; if (e.Key == Key.Enter && uiElement != null) { e.Handled = true; uiElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); } } 

如果它与winforms类似,对于你没有处理的按键,则将处理的标记为false,它将通过按键。 KeyEventArgs类

Handled获取或设置一个值,该值指示路由事件在路由中传输时事件处理的当前状态。 (inheritance自RoutedEventArgs。)

使用Handled = true PreviewKeyDown是一个糟糕的解决方案。 它将在调整阶段停止处理Key,并且永远不会将键事件冒泡。 简单来说,它会吃任何Enter键按下。 这意味着上层面板永远不会得到KeyDown事件(想象一下你的Window接受了一些关于ENTER KeyDown东西……)。

正确的解决方案是安东尼建议的:离开Handled = false , – 所以它继续冒泡 – 并跳过处理输入DataGrid内部

 public class DataGridWithUnhandledReturn : DataGrid { ///  protected override void OnKeyDown(KeyEventArgs e) { if (e.Key == Key.Return && e.KeyboardDevice.Modifiers == ModifierKeys.None) { return; } base.OnKeyDown(e); } }