VirtualizingStackPanel

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>

风格如下:
<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>

我将一个包含100.000个元素的集合设置为 ItemsSource ,并获得了很好的性能。除了一件事,一切都很好。当我在其中一个文本框中输入文本然后开始滚动时,我看到该文本在整个列表中随处可见!

我了解 VirtualizingStackPanel 的作用。它不断加载在滚动时变得可见的元素。我了解它的虚拟化技术的某些方面,但是我不知道如何理解这种奇怪的行为。我找不到有关WPF / Silverlight虚拟化的好的文档,所以请解释一下发生了什么

最佳答案

VirtualizingStackPanel实际上不会连续加载元素。取而代之的是,它重用了现有元素(控件),并简单地替换了它们后面的DataContext。

因此,如果您的VirtualizingStackPanel包含100,000个项目,一次只能显示10个项目,则通常会渲染约14个项目(滚动缓冲区的其他项目)。滚动时,这14个控件后面的DataContext会更改,但实际的控件本身永远不会被替换。

如果您执行类似在TextBox#1中输入Text的操作,并且TextBox.Text未绑定(bind)任何内容,则Text将始终显示,因为该控件正在被重用。如果将TextBox.Text绑定(bind)到一个值,则滚动时DataContext会更改,它将替换显示的Text。

关于wpf - VirtualizingStackPanel不会在ItemTemplate中清除TextBoxes的文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7649164/

10-13 23:48