我在ScrollViewer元素中包含的ListView中有一个GridView。
我理解WPF在运行时只绘制可见数据,例如在滚动网格上最初只绘制可见行 - 我的问题是我没有像我正在开发的便携式设备上的桌面那样强大的功能因此,我的WPF ListView - 在我的桌面上滚动正常 - 在便携式设备上非常慢,这使得页面无法使用(我只有15个隐藏行的smt)。
我是否可以使用任何肮脏的黑客来解决问题(例如,一旦页面加载或类似情况,一直向下滚动然后一直向上滚动)?
还有其他任何愚蠢的想法吗?我做错了吗?
任何帮助表示赞赏!
修改 无论行数多少(一些隐藏的行,3-4),一旦我尝试滚动,应用就会卡住一段时间。
编辑:这是我的XAML(为清晰起见,删除了样式):
<ScrollViewer Name="scrollViewer" Grid.Row="1">
<ScrollViewer.Resources>
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">60</sys:Double>
</ScrollViewer.Resources>
<ListView Name="recordContainer" Grid.Row="1" VirtualizingStackPanel.IsVirtualizing="False" ItemsSource="{Binding RecordCollection}">
<ListView.View>
<GridView>
<GridViewColumn Header="field1" DisplayMemberBinding="{Binding myField_1}"/>
<GridViewColumn Header="field2" DisplayMemberBinding="{Binding myField_2}"/>
</GridView>
</ListView.View>
</ListView>
</ScrollViewer>
答案 0 :(得分:3)
我需要指出的第一件事是WPF渲染使用DirectX。如果DirectX不可用,则系统会自动默认为软件渲染器(速度要慢得多)。
现在,如果DirectX可用(在所有成熟的计算机中都是如此,但在“便携式设备”上却不是这样),那么您的下一个问题就是显卡(或芯片)的功率。
我提出这个问题是因为你提到你的代码在便携式设备上使用样式(我假设它不是笔记本电脑)。如果是这样,便携式设备上桌面计算机上的操作可能会非常慢。
现在,你的风格复杂吗?或者他们有很多渲染工作? (即:复杂的渐变)。如果是这样,也许您可以考虑在便携式设备上执行时从应用程序中减少(或消除)它们。
WPF提供了一种很好的方法来确定正在执行软件的硬件是否能够处理负载。
代码如下:
int RenderTier = (RenderCapability.Tier >> 16);
现在,如果RenderTier == 0,那么你有一个无法提供任何硬件加速的视频卡(或芯片),因此所有渲染都将使用WPF软件渲染器完成(在CPU上)。
如果RenderTier == 1,那么你有部分加速。某些操作将在显卡上完成,其他操作将在CPU上完成
如果RenderTier == 2,你有完整的硬件加速,所有渲染都将在显卡上执行。
答案 1 :(得分:1)
答案 2 :(得分:0)
我不确定它会解决问题,但您可以尝试使用VirtualizingPanel
答案 3 :(得分:0)
如果您需要在加载时创建元素,并且不让虚拟化面板在用户滚动列表时创建它们,那么您只需将VirtualizingStackPanel.IsVirtualizing属性设置为false:
<ListView VirtualizingStackPanel.IsVirtualizing="False">
</ListView>
至于DataGrid vs ListView性能。我们发现第一个渲染时间在我们的项目上是不可接受的,并决定编写我们自己的基于ListView的网格控件。性能差异巨大:平均而言。 DataGrid的300ms我们从ListView获得了大约80ms ......
答案 4 :(得分:0)
避免将ScrollbarVisibility属性设置为"Auto"
,这会降低性能。而是将其设置为"Visible"
,"Disabled"
或"Hidden"
(在您的情况下可能为"Visible"
)。