【问题标题】:WPF DataGrid make new row TabStopWPF DataGrid 创建新行 TabStop
【发布时间】:2017-03-08 16:37:12
【问题描述】:

我有一个 CanUserAddRows="True" 的 DataGrid。我的表有多个列;用户可以通过按 Tab 编辑单元格并跳转到下一个单元格。当您位于最后一列时,Tab 会将您带到下一行。

但是,如果您正在编辑新行,当您在最后一列 Tab 时,焦点将跳转到窗口中的下一个控件,然后再创建新行。

我需要做的是将焦点跳转到 DataGrid 中新创建的行。老实说,我不知道从哪里开始解决这个问题。

编辑:我应该澄清一下,新行的第一列是应该获得焦点的那一列(想象一下有人用键盘填充网格,使用选项卡)。

【问题讨论】:

  • 所以你基本上希望 TAB 表现得像 ENTER?
  • 是的,如果可能的话

标签: c# .net wpf datagrid wpfdatagrid


【解决方案1】:

您可以为DataGrid 处理PreviewKeyDown 事件以拦截TAB 按键并以编程方式按下ENTER 按键:

<DataGrid x:Name="dg" ... PreviewKeyDown="dg_PreviewKeyDown" />

private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        e.Handled = true;

        var key = Key.Enter;
        var target = Keyboard.FocusedElement;
        var routedEvent = Keyboard.KeyDownEvent;

        dg.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(dg), 0, key)
        {
            RoutedEvent = routedEvent
        });
    }
}

【讨论】:

  • 这是一个聪明的主意,但它并没有完全按照应有的方式去做。我做了一些修改来改进它,但总的来说,当发送 Enter KeyDown 事件时,确实选择了新行,但是在原始 Tab 出现的右下方的列上。应该发生的是应该选择新行的第一列。我认为这是解决问题的一个很好的整体解决方案,通过一些闪烁我可以使它工作,谢谢。
  • “应该发生什么......”。不,这不是 ENTER 的行为方式。
  • 好吧,那么 ENTER 不是它所需要的。
  • 怎么样?
  • 我指的是您对“所以您基本上希望 TAB 表现为 ENTER?”的问题的回答。
猜你喜欢
  • 2016-01-13
  • 2017-08-31
  • 2021-10-29
  • 2013-06-08
  • 2018-03-01
  • 1970-01-01
  • 2011-09-29
  • 2015-04-06
  • 2013-06-27
相关资源
最近更新 更多