ScrollIntoView是否在virtualstackpannel中同步(特别是在WPF DataGrid中)?

ScrollIntoView是否在virtualstackpannel中同步(特别是在WPF DataGrid中)?,wpf,wpfdatagrid,itemscontrol,setfocus,itemcontainergenerator,Wpf,Wpfdatagrid,Itemscontrol,Setfocus,Itemcontainergenerator,在DataGrid的有界集合的数据刷新后,对其单元格进行聚焦有一个问题。 例如,我们为它的集合设置了一个过滤器,然后我们想要重新聚焦存储列的存储单元 我们真的认为对ScrollIntoView的调用是同步的吗?这意味着在调用它之后,我们所需的行和单元格被创建,我们可以设置焦点?(同样,这意味着在我们调用ScrollIntoView之后,我们是否真的认为Itemsgenerator完成了它的工作,并且我们确实可以找到我们想要的单元格) 美元 //设置DataGrid集合的筛选器 DataGrid_

在DataGrid的有界集合的数据刷新后,对其单元格进行聚焦有一个问题。 例如,我们为它的集合设置了一个过滤器,然后我们想要重新聚焦存储列的存储单元

我们真的认为对ScrollIntoView的调用是同步的吗?这意味着在调用它之后,我们所需的行和单元格被创建,我们可以设置焦点?(同样,这意味着在我们调用ScrollIntoView之后,我们是否真的认为Itemsgenerator完成了它的工作,并且我们确实可以找到我们想要的单元格)

美元

//设置DataGrid集合的筛选器
DataGrid_Standard.ScrollIntoView(行号、单元号);
//我们确信现在已经创建了所需的单元
DataGridRow=(DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(索引);
if(行==null)
{
//可能已虚拟化,请查看并重试
DataGrid_Standard.ScrollingToView(DataGrid_Standard.Items[索引]);
行=(DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(索引);
}
DataGridCellsPresenter=GetVisualChild(行容器);
//尝试获取该单元,但它可能已虚拟化
DataGridCell=(DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(列);
//现在试着把手机放在视野里,然后拿回手机
DataGrid_Standard.ScrollingToView(rowContainer,DataGrid_Standard.Columns[column]);
单元格=(DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(列);cell.focus();

这里有一个datagrid Selection changed事件处理程序,它将虚拟行移动到视图中,然后将焦点设置到该行。这对我很有用:

        private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataGrid dg = (DataGrid)sender;
        if (dg.SelectedItem == null) return;
        dg.ScrollIntoView(dg.SelectedItem);

        DataGridRow dg_row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem);
        if (dg_row == null) return;
       dg_row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

    }
编辑:使用dg_row.MoveFocus方法有一个不可靠的效果(复选框列需要单击两次才能设置,而不是单击一次),只使用它对我来说效果更好

dg_row.Focus();

这对您的情况应该很好。

任何想法都会非常有用谢谢您的回答,但大问题是:有时“DataGridRow dg_row=(DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem);如果(dg_row==null)返回;”发生,我们尝试了不同的情况,不幸的是,上面的代码似乎99%的时候都是空的,但有时检索到的行或单元格都是空的!!!!!看起来它们并不完全同步,我们也没有听说wpf主线程和wpf设计器线程之间到底发生了什么
dg_row.Focus();
Action action = () =>
      {
        dg .ScrollIntoView(dg .SelectedItem);

        var item = dg.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow;
        if (item == null) return;

        item.Focus();
      };

      Dispatcher.BeginInvoke(DispatcherPriority.Background, action);