使用箭头导航DataGrid WPF中的文本框

时间:2016-06-21 10:50:56

标签: c# wpf events datagrid

我有一个DataGrid,它使用DataGridTextColumns来显示一些数据,其中一些我希望能够更改。一切都很好,除了使用箭头导航它。如果我选择一个单元格并使用箭头移动,一切正常,但我想对TextBoxCell做同样的事情。 我所拥有和工作的是使用VisualTreeHelper浏览可视化树并获取下一个单元格并选择TextBox;但是,鉴于我必须分别处理每个密钥,这是非常非常长的代码。鉴于细胞已经以这种方式处理事件,我尝试了这个:

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) {
            TextBox tb = sender as TextBox;
            var temp = VisualTreeHelper.GetParent(tb);
            var cell = temp as DataGridCell;
            while (cell == null) {
                temp = VisualTreeHelper.GetParent(temp);
                cell = temp as DataGridCell;
            }
            if (tb == null)
                return;
            cell.RaiseEvent(e);
}

但每当我使用钥匙时,都没有任何反应。事件刚刚被跳过。代码一直运行到RaiseEvent,但是当调用该方法时,没有任何反应。 有任何想法吗? 提前谢谢!

1 个答案:

答案 0 :(得分:2)

如果其他人遇到它,问题就是事件。 DataGridCell不处理PreviewKeyDown,只处理KeyDown。解决方案是手动创建事件并将其发送到单元格。考虑到如果你未能将事件处理掉,它将触发两次。完整的代码如下;

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) {
        TextBox tb = sender as TextBox;
        if (tb != null && isControlKey(e.Key)) {
            var temp = VisualTreeHelper.GetParent(tb);
            var cell= temp as DataGridCell;
            while (cell== null) {
                temp = VisualTreeHelper.GetParent(temp);
                cell = temp as DataGridCell;
            }

            if (tb == null || cell== null)
                return;
            var target = cell;
            var routedEvent = Keyboard.KeyDownEvent;

            if (tb.Text.Trim().Length == 0) //Just a check for the value
                tb.Text = "0";

            cell.RaiseEvent(
                new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(cell), 0, e.Key) {
                    RoutedEvent = routedEvent
                });
            e.Handled = true;
        }
    }