EvA*_*lex 2 silverlight wpf virtualizingstackpanel
我将ItemsControl与VirtualizingStackPanel一起作为项目面板,如下所示:
<ItemsControl Style="{StaticResource ItemsControl}" Name="itemsControl"
Margin="0,100,0,0" HorizontalAlignment="Stretch" Height="80">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
风格如下:
<Style x:Key="ItemsControl" TargetType="ItemsControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Visible">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
我设置了一个包含100.000个元素作为ItemsSource的集合,并获得了非常好的性能.除了一件事,一切都很好.当我在其中一个文本框中输入文本然后开始滚动时,我发现该文本在整个列表中随处可见!
我理解VirtualizingStackPanel的功能.它会不断加载在滚动时变得可见的元素.我理解它的虚拟化技术的一些方面,但我不知道如何理解这种奇怪的行为.我没能在WPF/Silverlight虚拟化上找到好的文档,所以,请解释一下发生了什么
VirtualizingStackPanel实际上并没有连续加载元素.相反,它重用现有元素(控件)并简单地替换它们后面的DataContext.
因此,如果您有VirtualizingStackPanel100,000个项目,并且一次只能看到10个项目,它通常会呈现大约14个项目(滚动缓冲区的额外项目).滚动时,这14个控件后面的DataContext会被更改,但实际控件本身永远不会被替换.
如果您在TextBox#1中输入Text并且TextBox.Text没有绑定任何内容,那么Text将始终显示,因为控件正在重新使用.如果将TextBox.Text值绑定到某个值,则滚动时DataContext将更改,这将替换显示的文本.
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |