2013-04-16 67 views
1

當我取消選擇大量項目時,ListBox中出現性能問題。 我的列表框目前包含90,000多個項目。ListBox.SelectedItems as HashSet

我認爲性能問題是因爲SelectedItems是由List而不是HashSet表示的。

什麼是最簡單的方式來重新創建列表框功能,支持多選,並將選定的項目實現爲一個哈希集。

我不需要支持selectedindex,我認爲這就是爲什麼selecteditems是一個列表。

+8

90000+的物品!真的嗎?這裏有一個嚴重的可用性問題。 – Steve

+0

要添加到@Steve評論將或將會有用戶能夠看到他們將放棄90000+項目。 – Bit

+0

@Steve哈哈。是的,我支持過濾搜索。它用於編輯字典。 –

回答

1

您應該找到虛擬化ListBox的方法,以便並非所有元素都將被加載到內存中並一次添加到列表中,而是控件的佔位將只包含當前可見的元素,並且只在滾動時才加載其他元素,某種需求網狀負荷......

這個答案詳細描述了這個問題:https://stackoverflow.com/a/2784220/559144

而這個鏈接是非常有幫助的:Optimizing Performance: Controls

它會告訴你,其實WPF ListBox不支持虛擬化通過desfault而且,你還可以啓用:

  • 容器回收
  • 遞延滾動
+0

如果你移動選擇列表框中的所有內容,然後單擊一個項目,控件必須從SelectedItems List <>中刪除所有未選中的項目。 **列表<>有O(n)用於刪除項目。這是問題。**如果ListBox使用HashSet <>存儲關閉選項,則從選擇中刪除項目將爲O(1)。 我明白虛擬化的作用,但並不能消除數據本身。我的問題是數據。 我根本就沒有控制權,如果我正在使用帶有List <>的類並且一次只移除一個項目,它就會變得很慢。 –

0

我所做的就是創建一個選擇管理類,存儲了作爲一個HashMap的選擇。 然後我處理了ListBoxItem上的MouseDown並模仿shift和ctrl選擇。

我改變了選擇單,基本上忽略了默認的選擇反射。

這是我的XAML。在ListBox

<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>