Здравствуйте.
Нужно отобразить большое количество элементов комбобокса.
По советам гугла сделал виртуализацию:
<ComboBox x:Name="IllCombo" IsEditable="True" ItemsSource="{Binding IllSource}"
SelectedItem="{Binding SelectedIll}" ItemTemplate="{StaticResource ComboboxItemTemplate}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
Но это вообще никаким образом не влияет на работу. Как тормозило так и тормозит. (((
Что я не так сделал то?? И может быть есть какой нибудь способ добиться скорострельности с подстановкой вариантов каким нибудь другим образом??
AlexP
(Alex P.)
25.Март.2022 16:34:09
#2
Тут пишут из-за чего могут быть проблемы с виртуализацией: wpf - Why ComboBox be dropdown result whole app performance to very slow? - Stack Overflow
Но я б наверно думал в сторону того, чтоб отображать только после фильтрации.
Все равно ж никто не будет искать вручную среди тысяч.
Что вы имеете в виду??
Фильтрация то есть но надо ввести пару символов но и сам фильтр занимает тучу времени … Ну … может не тучу но для пользователя невероятно заметно …
Привязка к списку идет на стадии загрузки … иначе говорят виртуализация не будет работать …
AlexP
(Alex P.)
25.Март.2022 20:28:17
#4
Действительно вот эта штука помогла:
<Popup VerticalOffset="-1" SnapsToDevicePixels="True" Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsDropDownOpen}" AllowsTransparency="True" Focusable="False" PopupAnimation="Fade">
<Grid Name="DropDown" SnapsToDevicePixels="True" Width="{TemplateBinding ActualWidth}" MaxHeight="600">
<Border x:Name="DropDownBorder" Style="{DynamicResource ComboBoxControlStyle}"/>
<ScrollViewer x:Name="ScrollPopup" SnapsToDevicePixels="True" >
<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Grid>
</Popup>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
<!-- remove this trigger, because the virtualization is broken!!!
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
-->
<Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
<Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
<Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
</Trigger>
</ControlTemplate.Triggers>
И сортировка и отображение стало нормальным как и раньше