在WPF DataGrid中使用Enter键作为选项卡

时间:2012-04-23 20:22:35

标签: c# wpf mvvm datagrid

我在WPF中有DataGrid

当我点击 Enter 时我想移动到NextCell,当达到LastColumn时,它应该具有创建或移动到下一行的默认 Enter 功能。

我不想使用 Tab

我如何在WPF中执行此操作。

2 个答案:

答案 0 :(得分:0)

试试这个我觉得它起作用至少对我有用。

//datagrid gotfocus event
private void dataGrid1_GotFocus(object sender, RoutedEventArgs e)
{
    DependencyObject dep = (DependencyObject)e.OriginalSource;
    //here we just find the cell got focused ...
    //then we can use the cell key down or key up
    // iteratively traverse the visual tree
    while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
    {
        dep = VisualTreeHelper.GetParent(dep);
    }

    if (dep == null)
        return;

    if (dep is DataGridCell)
    {
        DataGridCell cell = dep as DataGridCell;
        //raise key down event of cell
        cell.IsSelected = true;
        cell.KeyDown += new KeyEventHandler(cell_KeyDown);
    }
}

void cell_KeyDown(object sender, KeyEventArgs e)
{
    DataGridCell cell = sender as DataGridCell;
    if (e.Key == Key.Enter)
    {
        cell.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        cell.IsSelected = false;
        e.Handled = true;
        cell.KeyDown -= cell_KeyDown;
    }
}

在此代码中,当一个单元格获得焦点并且用户键关闭时,下一个单元格将获得焦点。 祝你好运,希望这对你有所帮助。

编辑:

将此函数设置为datagrid PreviewKeyDown事件。

private void maindg_PreviewKeyDown(object sender, KeyEventArgs e)
        {

            //just accept enter key
            if (e.Key != Key.Enter) return;

        DependencyObject dep = (DependencyObject)e.OriginalSource;
        //here we just find the cell got focused ...
        //then we can use the cell key down or key up
        // iteratively traverse the visual tree
        while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
        {
            dep = VisualTreeHelper.GetParent(dep);
        }

        if (dep == null)
            return;

        if (dep is DataGridCell)
        {
            //cancel if datagrid in edit mode
            maindg.CancelEdit();
            //get current cell
            DataGridCell cell = dep as DataGridCell;
            //deselect current cell
            cell.IsSelected = false;
            //find next right cell
            var nextCell = cell.PredictFocus(FocusNavigationDirection.Right);
            //if next right cell null go for find next ro first cell
            if (nextCell == null)
            {
                DependencyObject nextRowCell;
                nextRowCell = cell.PredictFocus(FocusNavigationDirection.Down);
                //if next row is null so we have no more row Return;
                if (nextRowCell == null) return;
                //we do this because we cant use FocusNavigationDirection.Next for function PredictFocus
                //so we have to find it this way
                while ((nextRowCell as DataGridCell).PredictFocus(FocusNavigationDirection.Left) != null)
                    nextRowCell = (nextRowCell as DataGridCell).PredictFocus(FocusNavigationDirection.Left);
                //set new cell as next cell
                nextCell = nextRowCell;
            }
            //change current cell
            maindg.CurrentCell = new DataGridCellInfo(nextCell as DataGridCell);
            //change selected cell
            (nextCell as DataGridCell).IsSelected = true;
            // start edit mode
            maindg.BeginEdit();
        }
        //handl the default action of keydown
        e.Handled = true;
    }

答案 1 :(得分:-1)

更简单的实现。想法是捕获keydown事件,如果键是“Enter”,则移动到下一个选项卡,该选项卡是网格的下一个单元格。

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