【问题标题】:Get datagrid's scrollviewer获取datagrid的scrollviewer
【发布时间】:2016-12-14 00:02:23
【问题描述】:

我正在尝试让数据网格的滚动查看器能够设置偏移量(之前已存储)。

我使用这个功能:

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 的样式,因为我有 datagrids 使用它,而且它很复杂,有很多依赖项。

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

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

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您需要递归遍历 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;
    }
    

    【讨论】:

    • 谢谢,我还得在datagrid的loaded事件中调用函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2016-01-06
    • 2012-05-16
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多