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只是认为它有无限的空间.
问题是:有没有更好的方法来做到这一点,或者我怎样才能至少修复当前的技术以实现更好的用户体验?我正在生成数百个这样的项目,所以我需要虚拟化的性能增强.但是,我还需要允许用户调整窗口大小并保持有效滚动的能力.
非常感谢任何见解,谢谢和节日快乐!
好吧,这就是我最终所做的,不得不说这是一个巨大的进步!我们开始时将这首特定作品的加载时间设置为 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!它现在虚拟化得很好,它调整了大小,宇宙已经恢复平衡,我不再想打独角兽。之后,我只是剥离了视觉状态,因为我们不需要任何类型的项目选择,仅此而已,感谢大家的见解!抱歉,这次我没能获得赏金。
| 归档时间: |
|
| 查看次数: |
461 次 |
| 最近记录: |