C# 区分用户正在执行的滚动和WPF试图在数据网格中执行的滚动

C# 区分用户正在执行的滚动和WPF试图在数据网格中执行的滚动,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我有一个数据网格,里面有很多行。当我向下滚动并单击刷新时,我的滚动条默认位于页面顶部。但我希望我的滚动条在刷新后记住滚动位置 我的xaml看起来像这样 <DataGrid x:Name="inpatientorderGrid" ItemsSource="{Binding InpatientOrdersList, IsAsync=True}" ScrollViewer.ScrollChanged="ScrollChangeHandler"> private void Scroll

我有一个数据网格,里面有很多行。当我向下滚动并单击刷新时,我的滚动条默认位于页面顶部。但我希望我的滚动条在刷新后记住滚动位置

我的xaml看起来像这样

<DataGrid x:Name="inpatientorderGrid" ItemsSource="{Binding InpatientOrdersList,  IsAsync=True}" ScrollViewer.ScrollChanged="ScrollChangeHandler">

private void ScrollChangeHandler(object sender, ScrollChangedEventArgs scrollChangeEvent)
        {
            if (scrollChangeEvent.VerticalOffset > 0 || scrollChangeEvent.HorizontalOffset > 0)
            {
                dVerticalOffset = scrollChangeEvent.VerticalOffset;
                dHorizontalOffset = scrollChangeEvent.HorizontalOffset;
            }
                SetScrollViewerOffsets(dVerticalOffset, dHorizontalOffset);
        }

private void SetScrollViewerOffsets(double dVerticalOffset, double dHorizontalOffset)
        {
            DependencyObject dependencyObject = GetCurrentWorkItemDataGrid() as DependencyObject;
            if (dependencyObject != null)
            {
                ScrollViewer scrollViewer = GetScrollViewer(dependencyObject);
                if (scrollViewer != null)
                {
                    scrollViewer.ScrollToHorizontalOffset(dHorizontalOffset);
                    scrollViewer.ScrollToVerticalOffset(dVerticalOffset);
                }
            }
        }

private ScrollViewer GetScrollViewer(DependencyObject dependencyObject)
        {
            ScrollViewer scrollViewer = null;
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
            {
                if (VisualTreeHelper.GetChild(dependencyObject, i) is ScrollViewer)
                {
                    scrollViewer = (ScrollViewer)(VisualTreeHelper.GetChild(dependencyObject, i));
                }
                else
                {
                    scrollViewer = GetScrollViewer(VisualTreeHelper.GetChild(dependencyObject, i) as DependencyObject);
                }
            }
            return scrollViewer;
        }

我的xaml.cs文件如下所示

<DataGrid x:Name="inpatientorderGrid" ItemsSource="{Binding InpatientOrdersList,  IsAsync=True}" ScrollViewer.ScrollChanged="ScrollChangeHandler">

private void ScrollChangeHandler(object sender, ScrollChangedEventArgs scrollChangeEvent)
        {
            if (scrollChangeEvent.VerticalOffset > 0 || scrollChangeEvent.HorizontalOffset > 0)
            {
                dVerticalOffset = scrollChangeEvent.VerticalOffset;
                dHorizontalOffset = scrollChangeEvent.HorizontalOffset;
            }
                SetScrollViewerOffsets(dVerticalOffset, dHorizontalOffset);
        }

private void SetScrollViewerOffsets(double dVerticalOffset, double dHorizontalOffset)
        {
            DependencyObject dependencyObject = GetCurrentWorkItemDataGrid() as DependencyObject;
            if (dependencyObject != null)
            {
                ScrollViewer scrollViewer = GetScrollViewer(dependencyObject);
                if (scrollViewer != null)
                {
                    scrollViewer.ScrollToHorizontalOffset(dHorizontalOffset);
                    scrollViewer.ScrollToVerticalOffset(dVerticalOffset);
                }
            }
        }

private ScrollViewer GetScrollViewer(DependencyObject dependencyObject)
        {
            ScrollViewer scrollViewer = null;
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
            {
                if (VisualTreeHelper.GetChild(dependencyObject, i) is ScrollViewer)
                {
                    scrollViewer = (ScrollViewer)(VisualTreeHelper.GetChild(dependencyObject, i));
                }
                else
                {
                    scrollViewer = GetScrollViewer(VisualTreeHelper.GetChild(dependencyObject, i) as DependencyObject);
                }
            }
            return scrollViewer;
        }
private void ScrollChangeHandler(对象发送方,ScrollChangedEventArgs scrollChangeEvent)
{
如果(scrollChangeEvent.VerticalOffset>0 | | scrollChangeEvent.HorizontalOffset>0)
{
dVerticalOffset=scrollChangeEvent.VerticalOffset;
dHorizontalOffset=scrollChangeEvent.HorizontalOffset;
}
SetScrollViewerOffset(dVerticalOffset、dHorizontalOffset);
}
专用void SetScrollViewerOffset(双dVerticalOffset,双dHorizontalOffset)
{
DependencyObject DependencyObject=GetCurrentWorkItemDataGrid()作为DependencyObject;
if(dependencyObject!=null)
{
ScrollViewer ScrollViewer=GetScrollViewer(dependencyObject);
如果(scrollViewer!=null)
{
scrollViewer.ScrollToHorizontalOffset(dHorizontalOffset);
scrollViewer.ScrollToVerticalOffset(dVerticalOffset);
}
}
}
私有ScrollViewer GetScrollViewer(DependencyObject DependencyObject)
{
ScrollViewer ScrollViewer=null;
for(int i=0;i

每次向下滚动时,我的ScrollChangeHandler都会被调用,我会得到垂直偏移量和水平偏移量,并设置srcollviewer,但在此之后,wpf会尝试将页面重新加载到顶部,我的值会被重置。为了避免仅当偏移量>0时才执行逻辑。这解决了我原来的问题,但当我试图手动转到页面顶部时,我看到了一个错误,因为当我的滚动更改事件偏移量为零时,它会接受旧的偏移量。我如何区分手动滚动和wpf试图进行的滚动更改?

我想知道您的
刷新
按钮/?是什么??做什么?如果您绑定到一个
observateCollection
,则刷新只需向集合中添加或删除项即可。这不会影响整个网格的刷新。这听起来不错。让我试试这个,看看是否有效。我会随时通知你的。非常感谢。我尝试将可观察集合绑定到我的Datagrid,但问题仍然存在。最好显示
Refresh
的功能。请将此添加到问题中。如何使用GetScrollViewer()?重置后?