C#-获取数据网格的scrollviewer

我试图让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,而我无法获取scrollviewer.

只需在设置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的scrollviewer?

我没有粘贴数据网格的样式,因为我已经使用了数据网格,并且它具有许多依赖性,因此很复杂.

我以为它可能与虚拟化有关,但是我无法检索到此datagrid的scrollviewer:

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

解决方法:

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

C#-获取数据网格的scrollviewer

尝试以下功能:

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;
}
上一篇:将变量从Scriptlet传递到Javascript.


下一篇:javascript – 动态设置dojox.grid.datagrid标题列宽