列表框在添加新内容时滚动结束

时间:2011-01-31 18:37:48

标签: c# wpf visual-studio-2010 .net-4.0 listbox

我有一个绑定到CollectionViewSource的列表框(由ObservableCollection支持)。当我向后端集合添加项目时,列表框会自动将它们滚动到视图中。如何禁用此行为?

<ListBox ItemsSource="{Binding}"
                 ScrollViewer.VerticalScrollBarVisibility="Hidden"
                 ScrollViewer.HorizontalScrollBarVisibility="Visible"
                 HorizontalContentAlignment="Center"
                 VerticalContentAlignment="Stretch">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0"
                                CanVerticallyScroll="False"
                                CanHorizontallyScroll="True"
                                />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
编辑:这是在.NET 4.0,Visual Studio 2010中。使用AddRange时不会发生这种情况,但元素很昂贵,所以我使用Dispatcher.Invoke一次添加一个,以保持UI响应

EDIT2:因为它被建议了三次,我不使用VirtualizingStackPanel的原因是因为它虚拟化“太难”了。我发现它比常规堆栈面板执行更多的工作,因为使用我的方法,所有项目都创建一次,并且UI是响应式的。使用虚拟化面板时,当新项目滚动到视图中时,应用程序会锁定,因为它会暂停以创建更多项目。此外,对于未加载未正确接收事件的项目存在问题,并且如果滚动得太远,则先前的项目似乎被丢弃并且被迫在以后创建。 所以我使用了一个堆栈面板,在那里我避免了所有这些问题,除了初始加载时间,我几乎设法克服了这个问题。

1 个答案:

答案 0 :(得分:0)

检查其他元素在做什么。在这种情况下,我添加的元素(第三方软件)有一个错误,其中一个元素正在调用RequestBringIntoView。由于UI无法在所有这些调用之间进行更新,因此外观是列表框似乎会跳到最后。吞下事件会导致正确的行为。