我在WPF中有一个DataGrid

我想在我按Enter键时移到NextCell,并且在到达LastColumn时,它应该具有创建或移至下一行的默认Enter函数。

我不想使用Tab

我如何在WPF中做到这一点。

最佳答案

试试看,我认为它至少对我有用。

//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;
    }

10-08 00:59