【问题标题】:Grouping, virtualization and scrolling in a ListBoxListBox 中的分组、虚拟化和滚动
【发布时间】:2014-12-14 04:08:48
【问题描述】:

使用以下代码 ListBox 在滚动期间跳转到下一组。由于一组显示的项目多于屏幕,因此用户永远不会看到该组的所有项目。 由于我有很多项目,我需要虚拟化。

设置CanContentScroll="False" 解决了这个问题,但随后虚拟化消失了,UI 挂起 20 秒。有没有办法解决这个问题?

 <ListBox  
   VirtualizingStackPanel.IsVirtualizing="True"
   VirtualizingStackPanel.VirtualizationMode="Recycling"
   ScrollViewer.CanContentScroll="True">
    <ListBox.GroupStyle>
    <GroupStyle HidesIfEmpty="True">
        <GroupStyle.ContainerStyle>
        <Style TargetType="{x:Type GroupItem}">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate>
                <Expander IsExpanded="True">
                  <Expander.Header>
                     <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Type}"  />
                        ...
                     </StackPanel>
                  </Expander.Header>
                  <ItemsPresenter />

【问题讨论】:

  • 您使用的是什么版本的 WPF。分组和虚拟化在 v4.5 中得到修复
  • @WaltRitscher 我正在使用框架 4.5。如果我记得在 3.5 中根本没有虚拟化。

标签: wpf xaml


【解决方案1】:

尝试使用ScrollUnit=Pixel 属性来获得平滑滚动。默认值为ScrollUnit=Item,这会使组作为一个单元滚动。

<ListBox             
         VirtualizingPanel.IsVirtualizing='True'
         VirtualizingPanel.IsVirtualizingWhenGrouping='True'
         VirtualizingPanel.ScrollUnit='Pixel'
         />

【讨论】:

  • 好的,顺便说一句,我的意思是“这会导致行作为一个单元滚动”
  • 感谢您更新答案。如果我也设置CanContentScroll=False,它会正确滚动。在这两种情况下,虚拟化都会丢失。有没有办法解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多