Datagrid或者listview 中想要把相应的项 滚动到当前可见的位置, 必须满足2个条件:

1) 必须去掉虚拟化
     VirtualizingStackPanel.IsVirtualizing ="False"
2) 调用ScrollToView
       //Bring current selected item to view
            if(null != grdStudyList. SelectedItem && 0 != grdStudyList .Columns. Count)
            {
                //first focus the grid
                grdStudyList.Focus ();
                //then create a new cell info, with the item we wish to edit and the column number of the cell we want in edit mode
                DataGridCellInfo cellInfo = new DataGridCellInfo(grdStudyList .SelectedItem, grdStudyList.Columns [0]);
                //set the cell to be the active one
                grdStudyList.CurrentCell = cellInfo;
                //scroll the item into view
                grdStudyList.ScrollIntoView (grdStudyList. SelectedItem);    
            }         
3)如果不去掉虚拟化, VirtualizingStackPanel.IsVirtualizing ="True"
则, 调用如下语句:
  private void ScrollItemInSelector (Selector dtg, object needScrollItem)
        {
            //Bring current selected item to view
            if (null == dtg && null != needScrollItem )
            {
                //first focus the grid
                dtg.Focus ();
                dtg.SelectedItem = needScrollItem;
                dtg.Items .MoveCurrentTo( needScrollItem);
                ScrollViewer scv = FindVisualChild< ScrollViewer>(dtg );
                if (null != scv
                    && ( dtg.Items .CurrentPosition < scv.VerticalOffset - scv. ViewportHeight || dtg.Items .CurrentPosition > scv.VerticalOffset + scv. ViewportHeight)
                    )
                {
                    scv.ScrollToVerticalOffset (dtg. Items.CurrentPosition );
                }
            }
        }
  
05-29 00:26