代码之家  ›  专栏  ›  技术社区  ›  JohnIdol

便携式设备上的WPF ListView-滚动速度非常慢

  •  0
  • JohnIdol  · 技术社区  · 16 年前

    我在包含在ScrollViewer元素中的ListView中有一个GridView。

    我了解wpf在运行时只绘制可见数据,例如在滚动网格上,最初只绘制可见行-我的问题是,我没有为其开发的便携式设备上的台式机那样多的电源,因此我的wpf listview(在桌面上滚动正常)在便携式设备上的速度非常慢,这使得页面不可用(我只有一个类似SMT的15个隐藏行)。

    有没有什么肮脏的黑客,我可以用来绕过这个问题(如滚动一路向下,然后在页面加载或类似的所有方式向上返回)?

    还有其他的黑客想法吗?我做错什么了吗?

    感谢您的帮助!

    编辑: 不管行数有多小(一些隐藏的行,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>
    
    5 回复  |  直到 11 年前
        1
  •  3
  •   Carlos G.    16 年前

    我需要指出的第一件事是,WPF使用DirectX进行渲染。如果DirectX不可用,则系统将自动默认为软件渲染器(速度慢得多)。

    现在,如果DirectX可用(在所有全功能计算机中都是如此,但在“便携式设备”上则不是如此),那么下一个问题就是图形卡(或芯片)的电源。

    我之所以提到这一点,是因为您提到您的代码在便携式设备上使用样式(我假设它不是笔记本电脑)。如果是这样的话,台式电脑上的一小撮操作在便携设备上可能会非常慢。

    现在,你的风格复杂吗?或者他们有很多渲染工作?(即:复杂梯度)。如果是这样,也许您可以考虑在便携设备上执行时从应用程序中减少(或消除)它们。

    WPF提供了一种很好的方法来确定执行软件的硬件是否能够处理负载。

    代码为:

    int RenderTier = (RenderCapability.Tier >> 16);
    

    现在,如果rendertier==0,那么您有一个不能提供任何硬件加速的显卡(或芯片),因此所有渲染都将使用WPF软件渲染器(在CPU上)完成。

    如果rendertier==1,则 部分的 加速度。一些操作将在图形卡上完成,其他操作将在CPU上完成。

    如果rendertier==2,则硬件完全加速,所有渲染都将在图形卡上执行。

        3
  •  0
  •   Thomas Levesque    16 年前

    我不确定它是否能解决问题,但您可以尝试使用 VirtualizingPanel

        4
  •  0
  •   Anvaka    16 年前

    如果需要在加载时创建元素,并且不允许虚拟化面板在用户滚动列表时创建它们,则只需将virtualizingstackpanel.isvirtualizing属性设置为false:

    <ListView VirtualizingStackPanel.IsVirtualizing="False">
    </ListView>
    

    至于DataGrid与ListView的性能。我们发现第一个渲染时间在我们的项目中是不可接受的,并决定基于ListView编写我们自己的网格控件。性能差异是巨大的:从平均数据报的300毫秒,我们从ListView获得了约80毫秒…

        5
  •  0
  •   Botz3000 Amir Sheng    16 年前

    避免将ScrollBarVisibility属性设置为 "Auto" ,这会降低性能。而是将其设置为 "Visible" ,请 "Disabled" ,或 "Hidden" (可能是你的情况) “可见” )