关键方法是“dataGrid.SetKeyboardFocusToCell”。所以我们可以附加 KeyDown 事件:
private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
DataGridTemplateColumn col = (DataGridTemplateColumn)dataGrid.CurrentColumn;
if (col != null)
{
switch (col.SortMemberPath)
{
case "From":
if (e.Key == Key.Enter && Keyboard.Modifiers == ModifierKeys.None) // Pure Enter
{
e.Handled = true;
int columnIndex = dataGrid.GetColumnIndex(colTo);
DataGridRow currentRow = dataGrid.GetRow(dataGrid.CurrentItem);
dataGrid.SetKeyboardFocusToCell(dataGrid.CurrentItem, columnIndex);
Dispatcher.Invoke(() =>
{
GridTimeSpanBox timeSpanBox = VisualTree.FindChild<GridTimeSpanBox>(currentRow, tsb => tsb.Name == "tsbTo", true);
timeSpanBox.SelectAll();
}, System.Windows.Threading.DispatcherPriority.ContextIdle);
}
break;
}
} // col != null
}
/// <summary>
/// Get the row container that holds the 'item'
/// </summary>
public DataGridRow GetRow(object item)
{
return (DataGridRow)ItemContainerGenerator.ContainerFromItem(item);
}
/// <summary>
/// Gets the index of a 'DataGridColum' or 'DataGridTemplateColumn' in the 'Columns' list. This doesn't change if the user
/// reorders the columns.
/// </summary>
public int GetColumnIndex(DataGridColumn column)
{
return this.Columns.IndexOf(column);
}
在此示例中,也选择了以下框中的文本。对于大部分时间通过键入新内容来替换内容的字段可能很有用。
需要注意的是,通常必须通过调度程序发送“dataGrid.SetKeyboardFocusToCell()”之后的操作以允许 UI 完成更新。否则会发生奇怪的事情。
例如,使用这种方案,您甚至可以在当前行后面插入一行。