gpt4 book ai didi

c# - Listview 加载大列表非常慢

转载 作者:行者123 更新时间:2023-12-02 15:16:36 28 4
gpt4 key购买 nike

我有一个 WPF 应用程序,它搜索大型数据集并将结果显示在 ListView 中。搜索可以返回一个小的结果集,或者结果集可以是数千个项目。搜索数据集并返回结果集只需不到一秒钟的时间。返回集是一个 ObservableCollection。我的 ListView 在加载时速度很慢。 ListView 绑定(bind)到 XAML 中的 ObservableCollection。这是 XAML:

<GroupBox Header="Translations" Grid.Row="2" Margin="10,0,10,8">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="35" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListView Grid.ColumnSpan="2"
ItemsSource="{Binding FoundItems}"
SelectionMode="Single"
MaxHeight="2000"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True">
<ListView.View>
<GridView>
<GridViewColumn Header="Translation File Name" Width="NaN" DisplayMemberBinding="{Binding Path=FileName}" />
<GridViewColumn Header="English" Width="400" DisplayMemberBinding="{Binding Path=English}" />
<GridViewColumn Header="International" Width="400" DisplayMemberBinding="{Binding Path=International}" />
</GridView>
</ListView.View>
</ListView>
<Border Grid.Row="1" Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="{DynamicResource AccentColorBrush}">
<Grid Margin="5,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="130" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<RadioButton VerticalAlignment="Center" Content="Search English" IsChecked="{Binding Path=SearchEnglish}" />
<RadioButton VerticalAlignment="Center" Grid.Column="1" Content="Search International" IsChecked="{Binding Path=SearchInternational}" />
</Grid>
</Border>
</Grid>
</GroupBox>

这是 ListView 绑定(bind)到的 View 模型属性:

public ObservableCollection<DataAccess.TranslationItem> FoundItems
{
get
{
return p_FoundItems;
}
set
{
p_FoundItems = value;
NotifyOfPropertyChange("FoundItems");

TranslationsFound = string.Format("{0} translations found", p_FoundItems.Count);
}
}

这是构建 FoundItems 集合的代码。执行和构建集合只需几毫秒。速度问题绝对不在这里。它使用黑盒 DLL 来获取列表。然后构建可在 ObservableCollection 中使用的项目集合。

public List<TranslationItem> SearchList(bool fCaseSensitive, bool fIgnoreAmpersands, bool fExactMatch,
string sSearchLanguage, string sSearchString)
{
List<TTranslations.TranslationItem> lstFound = null;
List<TranslationItem> lstReturn = new List<TranslationItem>();

p_trItems.SearchingFile += p_trItems_SearchingFile;

lstFound = p_trItems.SearchList(fCaseSensitive, fIgnoreAmpersands, fExactMatch, sSearchLanguage, sSearchString);

foreach (TTranslations.TranslationItem tiItem in lstFound)
lstReturn.Add(new TranslationItem(tiItem));

return lstReturn;
}

在 View 模型中,我有以下代码负责设置 FoundItems。它将返回的集合转换为 ObservableCollection。

  FoundItems = new ObservableCollection<DataAccess.TranslationItem>(p_trItems.SearchList(p_fCaseSensitive, p_fIgnoreAmpersands, p_fExactMatch, p_fSearchEnglish ? "E" : "I", p_sSearchString));

这行代码前后的断点表明 FoundItems 仅需几毫秒即可构建。

知道为什么加载这么慢吗?这是从我在循环中手动构建列表的旧应用程序的转换,并且只需要一两次加载。

最佳答案

这最终成为一个简单的修复。我在 ListView 声明中添加了以下内容:

ScrollViewer.CanContentScroll="True"

现在看起来像这样:

    <ListView Grid.ColumnSpan="2"
ItemsSource="{Binding FoundItems}"
SelectionMode="Single"
MaxHeight="2000"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
ScrollViewer.CanContentScroll="True">

我的列表从需要至少一分钟来加载大型列表,到几乎是瞬间完成。

关于c# - Listview 加载大列表非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39901356/

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