获取datagrid的scrollviewer

时间:2016-12-14 00:02:24

标签: c# wpf datagrid

我试图让datagrid的scrollviewer能够设置偏移量(之前已存储过)。

我使用这个功能:

public static T GetVisualChild<T>(DependencyObject parent) where T : Visual       
{     
    T child = default(T);

    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
        {
            child = GetVisualChild<T>(v);
        }
        if (child != null)
        {
            break;
        }
    }
    return child;
}

我称之为:

this.dataGrid.ItemsSource = _myData;
ScrollViewer sc = ressource_design.GetVisualChild<ScrollViewer>(this.dataGrid);
if (sc != null) sc.ScrollToVerticalOffset(stateDatagrid.ScrollbarOffset);

它在许多情况下都有效,但在某些情况下,该函数返回null并且我无法获得滚动查看器。

此调用是在设置ItemsSource(项目的ObservableCollection)之后进行的,并且在90%的情况下运行良好。数据网格尚未呈现。

我也试过这个功能:

public static ScrollViewer GetScrollViewerFromDataGrid(DataGrid dataGrid)       
{        
    ScrollViewer retour = null;
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dataGrid) && retour == null; i++)
    {
        if (VisualTreeHelper.GetChild(dataGrid, i) is ScrollViewer)
        {

            retour = (ScrollViewer)(VisualTreeHelper.GetChild(dataGrid, i));

        }
    }
    return retour;
}

仍为空。

为什么我无法获取数据网格的滚动查看器?

我没有粘贴我的数据网格样式,因为我有数据网格使用它并且它很复杂,有许多依赖项。

我认为它可能与虚拟化有关,但我无法检索此数据网格的滚动查看器:

<DataGrid Style="{StaticResource StyleDataGrid}"  HeadersVisibility="None" ItemsSource="{Binding _Data}" Name="dataGrid1" RowDetailsVisibilityMode="Visible"  SelectionChanged="dataGrid1_SelectionChanged">

1 个答案:

答案 0 :(得分:4)

您需要通过VisualTree元素进行递归。您的函数仅查看DataGrid图层。如果ScrollViewer不在那里(见图片),你将找不到它。

enter image description here

尝试以下功能:

public static ScrollViewer GetScrollViewer(UIElement element)
{
    if (element == null) return null;

    ScrollViewer retour = null;
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element) && retour == null; i++) {
        if (VisualTreeHelper.GetChild(element, i) is ScrollViewer) {
            retour = (ScrollViewer) (VisualTreeHelper.GetChild(element, i));
        }
        else {
            retour = GetScrollViewer(VisualTreeHelper.GetChild(element, i) as UIElement);
        }
    }
    return retour;
}