gpt4 book ai didi

c# - 具有 AutoScroll 性能的虚拟化 ListView(慢)

转载 作者:行者123 更新时间:2023-11-30 18:01:48 27 4
gpt4 key购买 nike

我有一个 ListView 绑定(bind)到一个可观察的字符串集合。此集合添加到非常快(最多 30 分钟的时间)。它在没有虚拟化的情况下运行非常缓慢,我补充说它很棒。然而,在添加了一个列表自动滚动到底部的扩展器之后,它再次变得非常慢。我有如下 ListView :

<ListView  Background="Transparent"  
ItemsSource="{
Binding Source={
StaticResource MyViewModel}
,Path=MyList}"
VirtualizingStackPanel.IsVirtualizing="True"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>

为了滚动到最后,我使用了一些在网上找到的扩展器:

/// <summary>
/// This method will be called when the AutoScrollToEnd
/// property was changed
/// </summary>
/// <param name="s">The sender (the ListBox)</param>
/// <param name="e">Some additional information</param>
public static void OnAutoScrollToEndChanged(
DependencyObject s
, DependencyPropertyChangedEventArgs e)
{
var listBox = s as ListBox;
var listBoxItems = listBox.Items;
var data = listBoxItems.SourceCollection as INotifyCollectionChanged;

var scrollToEndHandler =
new NotifyCollectionChangedEventHandler(
(s1, e1) =>
{
if (listBox.Items.Count > 0)
{
object lastItem = listBox.Items[
listBox.Items.Count - 1];
Action action = () =>
{
listBoxItems.MoveCurrentTo(lastItem);
listBox.ScrollIntoView(lastItem);


};
action.Invoke();
}
});

if ((bool)e.NewValue)
data.CollectionChanged += scrollToEndHandler;
else
data.CollectionChanged -= scrollToEndHandler;
}

我不知道 ScrollIntoView 方法是如何工作的,但我担心它会抵消虚拟化的性能提升。我的另一个猜测是,要滚动到列表中的某个位置,它必须找到对象而不是仅仅跳转到索引。

所以我的问题是:我如何拥有一个更新非常快的 ListView ,其中有很多条目可以滚动到底部而不会减慢一切?

最佳答案

使用 listBox.ScrollIntoView(lastItem) 为每个项目插入/删除/修改操作更新 ListBox 控件。

每当 ListBox 项目被修改时,调用 listBox.SuspendLayout() 并在插入/删除/修改项目后使用 listBox.ResumeLayout()。我相信这会解决您的问题。

此外,如果您的 ListBox 将包含很多项目;我建议使用 DoubleBufferedListBox,这将有助于控件更新非常顺利。

关于c# - 具有 AutoScroll 性能的虚拟化 ListView(慢),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com