具有 GroupStyle 的列表框按组滚动,而不是按项目滚动
ListBox with GroupStyle scrolls by group, not by item
我有一个 ListBox
和一个 GroupStyle
。如果我使用 GroupStyle
ListBox
的 ScrollViewer
按组而不是那个项目滚动。因此,如果该组的项目多于屏幕上显示的项目,则用户永远不会看到屏幕外的项目。如果我注释掉 GroupStyle
,那么 ScrollViewer
就像一个项目一个项目地滚动一样。 (我添加了 ControlTemplate
来尝试不同的东西)。
<UserControl.Resources>
<CollectionViewSource x:Key="BusStopsFlattend" Source="{Binding BusStopsFlat}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="CountryCode" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</UserControl.Resources>
<ListBox Grid.Row="1" ItemsSource="{Binding Source={StaticResource BusStopsFlattend}}" Margin="48,0,48,60">
<ListBox.Template>
<ControlTemplate TargetType="{x:Type ListBox}">
<ScrollViewer CanContentScroll="True" HorizontalScrollBarVisibility="Disabled">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="0,24,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<controls:IconViewbox Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" IconData="{StaticResource IconPathPencilOutline}" IconSize="72" Margin="0,0,24,0" />
<TextBlock Grid.Column="1" Grid.Row="0" FontSize="32" TextWrapping="Wrap" Text="Name" />
<TextBlock Grid.Column="1" Grid.Row="1" FontSize="22" TextWrapping="Wrap" Text="Address" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</GroupStyle.Panel>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Grid.Row="0" FontSize="36" FontWeight="Bold" Margin="0,48,0,24" Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
只需将 ScrollViewer.CanContentScroll
属性 设置为 False
即可使用物理滚动而不是逻辑滚动。请记住,如果您决定使用它,这将禁用虚拟化。
我有一个 ListBox
和一个 GroupStyle
。如果我使用 GroupStyle
ListBox
的 ScrollViewer
按组而不是那个项目滚动。因此,如果该组的项目多于屏幕上显示的项目,则用户永远不会看到屏幕外的项目。如果我注释掉 GroupStyle
,那么 ScrollViewer
就像一个项目一个项目地滚动一样。 (我添加了 ControlTemplate
来尝试不同的东西)。
<UserControl.Resources>
<CollectionViewSource x:Key="BusStopsFlattend" Source="{Binding BusStopsFlat}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="CountryCode" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</UserControl.Resources>
<ListBox Grid.Row="1" ItemsSource="{Binding Source={StaticResource BusStopsFlattend}}" Margin="48,0,48,60">
<ListBox.Template>
<ControlTemplate TargetType="{x:Type ListBox}">
<ScrollViewer CanContentScroll="True" HorizontalScrollBarVisibility="Disabled">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="0,24,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<controls:IconViewbox Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" IconData="{StaticResource IconPathPencilOutline}" IconSize="72" Margin="0,0,24,0" />
<TextBlock Grid.Column="1" Grid.Row="0" FontSize="32" TextWrapping="Wrap" Text="Name" />
<TextBlock Grid.Column="1" Grid.Row="1" FontSize="22" TextWrapping="Wrap" Text="Address" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</GroupStyle.Panel>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Grid.Row="0" FontSize="36" FontWeight="Bold" Margin="0,48,0,24" Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
只需将 ScrollViewer.CanContentScroll
属性 设置为 False
即可使用物理滚动而不是逻辑滚动。请记住,如果您决定使用它,这将禁用虚拟化。