WPF DataGrid: how do I stop auto scrolling when a

2019-01-22 02:33发布

Problem:
If my DataGrid is not entirely visible (horizontal & vertical scrollbars are showing) and I click on one of my cells that is partially visible, the grid auto-scrolls to bring that cell into view. I don't want this to happen. I've tried playing around with RequestBringIntoView, like this:

private void DataGrid_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
    e.Handled = true;
}

But that does nothing.

Things I've tried:

  • My cells are custom UserControls; I tried putting an event handler for RequestBringIntoView on all UserControls that make up my cells, and tried handling the event, thinking that maybe I wasn't doing enough by just handling RequestBringIntoView on the DataGrid itself. This did not work.
  • Hosted the DataGrid inside of a ScrollViewer, and handled the ScrollViewer's RequestBringIntoView event. This actually works, and stops the auto-scrolling behavior, but in my case hosting a DataGrid inside of a ScrollViewer is not at all desirable, so I need to come up with a different solution.

I'm not sure how to stop this behavior, any ideas?

9条回答
虎瘦雄心在
2楼-- · 2019-01-22 03:30

I took more time to have a look at this problem as my first solution wasn't working.

However the answer of John is almost the good one. The trick is to catch the RequestBringIntoView event BEFORE it gets to the ScrollViewer in order to mark it has handled.

If you don't have to refine the whole template, you can use the following code:

var scp = TreeHelper.FindVisualChild<ScrollContentPresenter>(this.datagrid);
scp.RequestBringIntoView += (s, e) => e.Handled = true;

We use the ScrollContentPresenter because it's just below the ScrollViewer in the visual tree.

Hope this helps !

查看更多
手持菜刀,她持情操
3楼-- · 2019-01-22 03:32

As Dr.WPF has answered a similar question here the RequestBringIntoView should be handled in ItemsPanel.

查看更多
等我变得足够好
4楼-- · 2019-01-22 03:35

Here's what worked for me (after trying all of the less complex "answers" to date):

    <DataGrid Grid.Column="0" Grid.Row="1"
              Name="ListItemContainerDataGrid"
              ScrollViewer.VerticalScrollBarVisibility="Visible"
              ScrollViewer.CanContentScroll="False"
              And.Others
              ItemsSource="{Binding Path=ListItemModels}"
              >
    </DataGrid>

ScrollViewer.CanContentScroll="False" seems mindbogglingly counter intuitive...

查看更多
登录 后发表回答