【问题标题】:ListBox.SelectedItems as HashSetListBox.SelectedItems 作为 HashSet
【发布时间】:2013-04-16 22:02:34
【问题描述】:

取消选择大组项目时,我在 ListBox 中遇到性能问题。 我的 ListBox 目前包含 90,000 多个项目。

我认为性能问题是因为 SelectedItems 由 List 而不是 HashSet 表示。

重新创建 ListBox 功能、支持多选以及将选定项实现为哈希集的最简单方法是什么。

我不需要支持 selectedindex,我认为这就是为什么 selecteditems 是一个列表。

【问题讨论】:

  • 列表框中有 90000 多个项目!,真的吗?您在这里遇到了严重的可用性问题。
  • 要添加到@Steve 评论,用户将能够或将能够查看他们将放弃的 90000 多个项目。
  • @Steve 哈哈。是的,我支持过滤搜索。这是用来编辑字典的。

标签: c# wpf list


【解决方案1】:

您应该找到一种虚拟化ListBox 的方法,以便并非所有元素都将立即加载到内存中并添加到列表中,而是控件的占用空间将仅包含当前可见的元素并仅在以下情况下加载其他元素滚动,某种类似网络的按需加载...

这个答案详细描述了这个问题:https://stackoverflow.com/a/2784220/559144

这个链接很有帮助:Optimizing Performance: Controls

它告诉您WPF ListBox 实际上确实支持默认虚拟化,并且您可以另外启用:

  • 容器回收
  • 延迟滚动

【讨论】:

  • 如果您移位选择列表框中的所有内容,然后单击一项,则控件必须从 SelectedItems 列表中删除所有未选择的项目。 List 有 O(n) 用于删除项目。这就是问题所在。 如果 ListBox 使用 HashSet 来存储选择,从选择中删除项目将是 O(1)。我了解虚拟化的作用,但它不会消除数据本身。我的问题是数据。我根本无法控制,如果我使用带有 List 的类并一次删除每个项目,它会一样慢。
【解决方案2】:

我所做的是创建一个管理选择的类,将选择存储为 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多