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

时间:2011-04-12 20:12:18

标签: c# wpf datagrid override key-bindings

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

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

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

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

提前致谢

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

/// <summary>
/// On Enter Key, it tabs to into next cell.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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));
    }
}

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

PreviewKeyDown

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

正确的解决方案是安东尼建议的:离开Handled = false, - 继续冒泡 - 并跳过处理在DataGrid中输入

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

        base.OnKeyDown(e);
    }
}