user259480
user259480

Reputation:

Smooth scrolling for WPF DataGrid

I am using WPF datagrid, only modification I have in place is:

    <toolkit:DataGridTextColumn.ElementStyle>
       <Style TargetType="TextBlock">
       <Setter Property="TextWrapping" Value="Wrap"/>
      </Style>
    </toolkit:DataGridTextColumn.ElementStyle>

I have this modification so if the cell contents are longer, they stretch the line height, no text is hidden. Problem is with DataGrid's scrolling behaviour - it jumps whole lines when scrolling, which does not work well at all if the row is higher than one line - scrollbar is jerking on scrolling etc.

Is there any way to make WPF DataGrid scroll "smoothly" and not line by line?

Thanks

Upvotes: 26

Views: 19171

Answers (4)

Welcor
Welcor

Reputation: 3093

Use this:

<DataGrid VirtualizingPanel.ScrollUnit="Pixel">

Dont use CanContentScroll="False". It disables virtualisation, which can causes long loading times when you have a lot of rows. Virtualisation means it will only render the data that is shown and not all the data of the datagrid.

However, disabling virtualization can be helpful if you don't have too many rows, but each row is complex to create (complex datatemplates/controls, a lot of data etc. in each row).

Upvotes: 29

kazem
kazem

Reputation: 3749

  <DataGrid Grid.Row="1"
              CanUserAddRows="False" 
              CanUserDeleteRows="False" 
              CanUserReorderColumns="False" 
              CanUserSortColumns="False" 
              SelectionUnit="FullRow" 
              HeadersVisibility="None"
              Name="grd" 
              GridLinesVisibility="None"
              ItemsSource="{Binding}"
              AutoGenerateColumns="False" 
              ScrollViewer.CanContentScroll="False">
</DataGrid>

Upvotes: -3

erodewald
erodewald

Reputation: 1825

I haven't played with the DataGrid explicitly, but it is factual that using ScrollViewer.CanContentScroll=False swaps out the default ItemsPanelTemplate which uses the VirtualizedStackPanel with a regular StackPanel. It will scroll smoothly, but it will be rendering every item even if it's not visible.

This can absolutely kill performance if you're dealing with either a complex visual tree or large datasets.

Upvotes: 35

Bryan Anderson
Bryan Anderson

Reputation: 16129

The DataGrid has an Attached property, ScrollViewer.CanContentScroll, that manages this behavior. To get smooth scrolling you'll need to set it to False.

Upvotes: 30

Related Questions