我想我错过了设置焦点,但如何实现这一点?
以编程方式聚焦
DataGrid
要获得与使用鼠标单击行时完全相同的行为,需要付出一些努力。详情请参阅以下博文。
How to programmatically select and focus a row or cell in a DataGrid in WPF
private static void SelectRowByIndex(DataGrid dataGrid, int rowIndex)
{
if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
throw new ArgumentException(
"The SelectionUnit of the DataGrid must be set to FullRow.");
if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
throw new ArgumentException(string.Format(
"{0} is an invalid row index.", rowIndex));
dataGrid.SelectedItems.Clear();
object item = dataGrid.Items[rowIndex];
dataGrid.SelectedItem = item;
DataGridRow row =
dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex)
as DataGridRow;
if (row == null)
{
dataGrid.ScrollIntoView(item);
row = dataGrid.ItemContainerGenerator
.ContainerFromIndex(rowIndex) as DataGridRow;
}
if (row != null)
{
DataGridCell cell = GetCell(dataGrid, row, 0);
if (cell != null)
cell.Focus();
}
}
private static DataGridCell GetCell(DataGrid dataGrid,
DataGridRow rowContainer, int column)
{
if (rowContainer != null)
{
DataGridCellsPresenter presenter =
FindVisualChild<DataGridCellsPresenter>(rowContainer);
if (presenter == null)
{
rowContainer.ApplyTemplate();
presenter =
FindVisualChild<DataGridCellsPresenter>(rowContainer);
}
if (presenter != null)
{
DataGridCell cell =
presenter.ItemContainerGenerator.ContainerFromIndex(column)
as DataGridCell;
if (cell == null)
{
dataGrid.ScrollIntoView(rowContainer,
dataGrid.Columns[column]);
cell =
presenter.ItemContainerGenerator
.ContainerFromIndex(column) as DataGridCell;
}
return cell;
}
}
return null;
}
private static T FindVisualChild<T>(DependencyObject obj)
where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T)
return (T)child;
else
{
T childOfChild = FindVisualChild<T>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}