大型可滚动数据SL4的虚拟化性能问题

Chr*_* W. 12 c# silverlight xaml datatemplate uiscrollview

问题:在可滚动区域中显示大量数据具有可怕的性能和/或用户体验.

尝试:基本上在ListBox中设置DataTemplate以显示填充数据的网格,VirtualizationMode设置为Recycle,并在ListBox上设置固定高度.类似下面的例子.

 <ListBox x:Name="Items"
      TabNavigation="Once"
      VirtualizingStackPanel.VirtualizationMode="Recycling"     
      Height="500">         
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0,5">
                        <HyperlinkButton Content="Action" Margin="5"/>
                        <ContentControl  
                                cal:View.Model="{Binding}"  
                                VerticalContentAlignment="Stretch" 
                                HorizontalContentAlignment="Stretch"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
Run Code Online (Sandbox Code Playgroud)

ContentControl <Grid>将从另一个视图中引入一个标准,该视图格式化由大约20个静态和20个数据绑定TextBlock组成的填充项的整体布局.

这样可以正常工作,并将初始负载减少一半.但是,现在的问题是我需要高度的能力不是一个固定的大小,所以它占用了其父级可用的空间,甚至可以调整大小.感谢@DanFox我发现你必须以一种或另一种形式修复高度以调用虚拟化,或者RenderEngine只是认为它有无限的空间.

问题是:有没有更好的方法来做到这一点,或者我怎样才能至少修复当前的技术以实现更好的用户体验?我正在生成数百个这样的项目,所以我需要虚拟化的性能增强.但是,我还需要允许用户调整窗口大小并保持有效滚动的能力.

非常感谢任何见解,谢谢和节日快乐!

Chr*_* W. 1

好吧,这就是我最终所做的,不得不说这是一个巨大的进步!我们开始时将这首特定作品的加载时间设置为 77 秒。通过对背面的绑定方式进行一些重构,我们缩短了大约 20 秒,因此问题仍然出在 UI 渲染上。下面的答案显然比我最初想象的更简单,现在我们在 15-20 秒内加载大量数据(当然有虚拟化),而较小的负载基本上是瞬时的,让我们回到正轨。

这就是我所做的;

 <!-- This needs to be contained in a parent panel like a grid -->
 <ListBox x:Name="Items" >
                <ListBox.Template>
                    <ControlTemplate> <!-- Broke it out to allow resizing -->
                        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                            <ItemsPresenter/> <!-- This little fella does magical things -->            
                        </ScrollViewer>         
                    </ControlTemplate>      
                </ListBox.Template>
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling"/>  <!-- Recycle was a must -->        
                    </ItemsPanelTemplate>       
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <HyperlinkButton  VerticalAlignment="Top" Margin="5" />
                                <!-- This guy I did need to set a minwidth on to retain nice and predictable scrolling 
 when datacontext was potentially changing -->
                            <ContentControl cal:View.Model="{Binding}" MinWidth="1160"
                                            VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" />
                        </StackPanel>
                    </DataTemplate>         
                </ListBox.ItemTemplate>           
            </ListBox>
Run Code Online (Sandbox Code Playgroud)

就是这样!瞧!所需要做的就是分解 ControlTemplate 并应用直接的 ItemsPresenter!它现在虚拟化得很好,它调整了大小,宇宙已经恢复平衡,我不再想打独角兽。之后,我只是剥离了视觉状态,因为我们不需要任何类型的项目选择,仅此而已,感谢大家的见解!抱歉,这次我没能获得赏金。