Reputation:
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
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
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
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
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