WPF datagrid 行虚拟化后, 滚动条很卡。求解决方案~~

jxnc8610 2016-06-24 03:41:49
WPF DataGrid 自带的行虚拟化功能 --

EnableRowVirtualization="True"
EnableColumnVirtualization="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
VirtualizingStackPanel.IsVirtualizing="True"

加载数据后,拖动滚动条, 卡得不行,很久才刷新。。
求大神赐解决方案。。。
...全文
4115 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
先得找到卡的原因,如果是因为数据多的话可以采用延迟加载
E次奥 2016-11-25
  • 打赏
  • 举报
回复
要是数据过多的话可以不加载所有,只确定总共有多少条数据的个数,然后设置滚动条大小,根据滚动条的位置加载对应的一页数据就行了;
muzizongheng 2016-09-22
  • 打赏
  • 举报
回复
如果开了虚拟化, 拖到多少万行数据都不应该会卡. 应该看看ScrollViewer.CanContentScroll的值, 是不是因为它的值有问题,导致虚拟化被禁用了.
胖头鱼2016 2016-07-05
  • 打赏
  • 举报
回复
开启虚拟化还卡那应该是你绑定的数据出错了,你仔细检查下你是否使用了转化器,是否数据正常加载!
黑娃 2016-07-04
  • 打赏
  • 举报
回复
可能是你在datagridRowLoading的方法里面写了什么创建代码吧,所以一滚动就触发。正常情况下datagrid不会这么卡的,虚拟化默认就开了,我datagrid绑定了5000多行,滚动随便拉一点都不卡
wren406789306 2016-07-01
  • 打赏
  • 举报
回复
楼主的问题我也遇到过,不过我是加载的600多条数据. 贴上代码,希望对楼主有所帮助. <DataGrid Name="ParametersList" Grid.Row="1" RowBackground="Transparent" ItemsSource="{Binding Source={StaticResource FilterTasks}}" AutoGenerateColumns="False" Background="Transparent" RowHeaderWidth="0" BorderBrush="Transparent" FontSize="14" EnableRowVirtualization="True" EnableColumnVirtualization="True" CanUserAddRows="False"/> 不过因为程序需要用了筛选器,见下: <UserControl.Resources> <CollectionViewSource x:Key="FilterTasks" Source="{Binding ParameterList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Filter="CollectionViewSource_Filter"/> </UserControl.Resources>
  • 打赏
  • 举报
回复
引用 3 楼 jxnc8610 的回复:
没有分页需求,只能在现在的基础上优化
大概多少条数据? 修改DataGrid的Template模板,设置Scrollviewer 的VirtualizingStackPanel 属性。
jxnc8610 2016-06-27
  • 打赏
  • 举报
回复
引用 1 楼 qqamoon 的回复:
[quote=引用 楼主 jxnc8610 的回复:] WPF DataGrid 自带的行虚拟化功能 -- EnableRowVirtualization="True" EnableColumnVirtualization="True" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True" 加载数据后,拖动滚动条, 卡得不行,很久才刷新。。 求大神赐解决方案。。。
开始学 wpf 的时候也用过这些代码,不过现在不用了 [/quote] 有什么好的解决方案?不用分页。
jxnc8610 2016-06-27
  • 打赏
  • 举报
回复
没有分页需求,只能在现在的基础上优化
  • 打赏
  • 举报
回复
分页。
龍过鸡年 2016-06-27
  • 打赏
  • 举报
回复
引用 4 楼 jxnc8610 的回复:
有什么好的解决方案?不用分页。
没必要啊,默认就是开启的 https://social.msdn.microsoft.com/Forums/vstudio/en-US/9ea28468-5505-4e28-8220-e216b77ecf28/wpf-datagrid-and-virtualization 所以,建议你好好需要检查一下datagrid中所加载的对象,以及有没有使用数据分组。 在 datagrid 默认的 template 定义中有如下代码

<Style.Triggers>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsGrouping" Value="true" />
            <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false" />
        </MultiTrigger.Conditions>
            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
    </MultiTrigger>
</Style.Triggers>
可见,当 datagrid 启用了分组且virtualizingpanel 的当分组时不虚化, ScrollViewer.CanContentScroll 才会为 false 至于 ScrollViewer.CanContentScroll 跟 virtualizing 有什么关系,你可以参考下面几篇文章 ScrollViewer.CanContentScroll 属性 https://msdn.microsoft.com/zh-cn/library/system.windows.controls.scrollviewer.cancontentscroll(v=vs.110) WPF的UI虚拟化 http://www.cnblogs.com/TianFang/p/4199698.html 精通 WPF UI Virtualization http://www.cnblogs.com/zgynhqf/archive/2011/12/12/2284335.html
龍过鸡年 2016-06-24
  • 打赏
  • 举报
回复
引用 楼主 jxnc8610 的回复:
WPF DataGrid 自带的行虚拟化功能 -- EnableRowVirtualization="True" EnableColumnVirtualization="True" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True" 加载数据后,拖动滚动条, 卡得不行,很久才刷新。。 求大神赐解决方案。。。
开始学 wpf 的时候也用过这些代码,不过现在不用了

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧