让我感到困扰的是,按下数据网格中的回车键会将选择项向下移动一个项目,我希望能够确定它在正常的keydown事件中的作用。
所以我所做的是创建一个继承DataGrid并覆盖OnKeyDown事件并将其用作我的datagrid的新类。
这会产生一系列全新的问题,因为我显然必须重写所有其他按键(箭头键导航,shift +箭头键选择,pgup / pgdn等等)。我一直试图破解它,但只是花了很多时间来重写那些已经写好的东西,而且可能比我想出的更好。
那么如何在不弄乱datagrid的其他默认键绑定的情况下让enter键执行我想要的操作?
提前致谢
答案 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);
}
}