取消选择大量项目时,我在 ListBox 中遇到性能问题。我的 ListBox 目前包含 90,000 多个项目。
我认为性能问题是因为 SelectedItems 由 List 而不是 HashSet 表示。
什么是重新创建 ListBox 功能、支持多选以及将选定项实现为哈希集的最简单方法。
我不需要支持 selectedindex,我认为这就是为什么 selecteditems 是一个列表的原因。
您应该找到一种虚拟化的方法,ListBox
以便并非所有元素都将立即加载到内存中并添加到列表中,而是控件的占用空间将仅包含当前可见的元素并仅在滚动时加载其他元素,某种网络- 像按需加载...
这个答案详细描述了这个问题:https ://stackoverflow.com/a/2784220/559144
这个链接非常有帮助:优化性能:控件
它告诉您WPF ListBox
实际上确实默认支持虚拟化,并且您还可以启用:
我所做的是创建一个管理选择的类,将选择存储为 HashMap。然后我处理 ListBoxItem 上的 MouseDown 并模仿 shift 和 ctrl 选择。
我将选择更改为单一,基本上忽略了默认选择反射。
这是我的 XAML。
<ListBox Margin="2"
Grid.Column="0"
Name="WordList"
ItemsSource="{Binding Source={StaticResource CVS}}"
SelectionMode="Single">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewMouseDown" Handler="Clicked"/>
<EventSetter Event="PreviewMouseMove" Handler="MouseMoved"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<TextBlock Name="Text" Text="{Binding Word}"/>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter TargetName="Text" Property="Background" Value="LightBlue"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>