Warm tip: This article is reproduced from serverfault.com, please click

c#-获取datagrid的scrollviewer

(c# - Get datagrid's scrollviewer)

发布于 2016-12-14 00:02:23

我正在尝试让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">
Questioner
user2088807
Viewed
0
WPFGermany 2016-12-14 14:41:48

你需要递归遍历所有VisualTree元素。你的功能仅查看DataGrid图层。如果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;
}