當我取消選擇大量項目時,ListBox中出現性能問題。 我的列表框目前包含90,000多個項目。ListBox.SelectedItems as HashSet
我認爲性能問題是因爲SelectedItems是由List而不是HashSet表示的。
什麼是最簡單的方式來重新創建列表框功能,支持多選,並將選定的項目實現爲一個哈希集。
我不需要支持selectedindex,我認爲這就是爲什麼selecteditems是一個列表。
當我取消選擇大量項目時,ListBox中出現性能問題。 我的列表框目前包含90,000多個項目。ListBox.SelectedItems as HashSet
我認爲性能問題是因爲SelectedItems是由List而不是HashSet表示的。
什麼是最簡單的方式來重新創建列表框功能,支持多選,並將選定的項目實現爲一個哈希集。
我不需要支持selectedindex,我認爲這就是爲什麼selecteditems是一個列表。
您應該找到虛擬化ListBox
的方法,以便並非所有元素都將被加載到內存中並一次添加到列表中,而是控件的佔位將只包含當前可見的元素,並且只在滾動時才加載其他元素,某種需求網狀負荷......
這個答案詳細描述了這個問題:https://stackoverflow.com/a/2784220/559144
而這個鏈接是非常有幫助的:Optimizing Performance: Controls
它會告訴你,其實WPF ListBox
不支持虛擬化通過desfault而且,你還可以啓用:
如果你移動選擇列表框中的所有內容,然後單擊一個項目,控件必須從SelectedItems List <>中刪除所有未選中的項目。 **列表<>有O(n)用於刪除項目。這是問題。**如果ListBox使用HashSet <>存儲關閉選項,則從選擇中刪除項目將爲O(1)。 我明白虛擬化的作用,但並不能消除數據本身。我的問題是數據。 我根本就沒有控制權,如果我正在使用帶有List <>的類並且一次只移除一個項目,它就會變得很慢。 –
我所做的就是創建一個選擇管理類,存儲了作爲一個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>
90000+的物品!真的嗎?這裏有一個嚴重的可用性問題。 – Steve
要添加到@Steve評論將或將會有用戶能夠看到他們將放棄90000+項目。 – Bit
@Steve哈哈。是的,我支持過濾搜索。它用於編輯字典。 –