使用DataGrid的PreviewKeyDown方法
/// <summary> /// 回车将焦点移动到下一个单元格 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void RepairItems_PreviewKeyDown(object sender, KeyEventArgs e) { try { if (e.Key == Key.Enter) { e.Handled = true; Int32 row = this.repairItems.Items.IndexOf(this.repairItems.CurrentItem); Int32 Col = this.repairItems.Columns.IndexOf(this.repairItems.CurrentColumn); var cell = GetCell(this.repairItems, row, Col + 1); if (cell != null) { cell.IsSelected = true; cell.Focus(); this.repairItems.BeginEdit(); } } } catch (Exception ) { throw; } } /// <summary> /// 根据行、列索引取的对应单元格对象 /// </summary> /// <param name="row"></param> /// <param name="column"></param> /// <returns></returns> public DataGridCell GetCell(DataGrid grid, int row, int column) { DataGridRow rowContainer = GetRow(grid, row); if (rowContainer != null) { DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); if (presenter == null) { grid.ScrollIntoView(rowContainer, grid.Columns[column]); presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); } DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); return cell; } return null; } /// <summary> /// 根据行索引取的行对象 /// </summary> /// <param name="index"></param> /// <returns></returns> public DataGridRow GetRow(DataGrid grid, int index) { DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); if (row == null) { grid.ScrollIntoView(grid.Items[index]); row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); } return row; } /// <summary> /// 获取指定类型的子元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="parent"></param> /// <returns></returns> private T GetVisualChild<T>(Visual parent) where T : Visual { T child = default(T); int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { Visual visual = (Visual)VisualTreeHelper.GetChild(parent, i); child = visual as T; if (child == null) { child = GetVisualChild<T>(visual); } if (child != null) { break; } } return child; }