首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VirtualizingStackPanel没有清除ItemTemplate中的TextBoxes文本

VirtualizingStackPanel没有清除ItemTemplate中的TextBoxes文本
EN

Stack Overflow用户
提问于 2011-10-04 14:06:55
回答 2查看 637关注 0票数 2

我有VirtualizingStackPanelItemsControl作为条目面板,如下所示:

代码语言:javascript
复制
<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>

风格如下:

代码语言:javascript
复制
<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虚拟化上找不到好的文档,所以,请解释一下发生了什么

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-04 14:16:08

VirtualizingStackPanel实际上并不连续地加载元素。相反,它重用现有元素(控件),只需替换它们后面的DataContext。

因此,如果您有一个包含100,000项的VirtualizingStackPanel,并且一次只有10项可见,它通常会呈现大约14项(滚动缓冲区的额外项)。当您滚动时,这14个控件后面的DataContext将被更改,但实际控件本身将永远不会被替换。

如果您在TextBox #1中执行类似输入文本的操作,并且TextBox.Text没有绑定到任何内容,那么文本将始终显示出来,因为控件正在被重用。如果将TextBox.Text绑定到一个值,则当您滚动将替换显示的文本时,DataContext将发生更改。

票数 6
EN

Stack Overflow用户

发布于 2011-10-04 14:36:21

不确定如何在VirtualizingStackPanel中直接关闭回收,但这是ListBox中的语法。我本来会发评论的,但我想要格式化的代码。

代码语言:javascript
复制
   <ListBox VirtualizingStackPanel.VirtualizationMode="Standard" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7649164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档