WPF: ListBox с WrapPanel, проблема с вертикальной прокруткой
У меня есть UserControl (XAML ниже), у которого есть ListBox, который я хочу отображать изображения внутри WrapPanel, где изображения отображаются так же, как и в одной строке, а затем переносятся на следующую строку и т.д. Это работает, кроме когда ListBox растет выше, чем доступное пространство в окне, я не получаю вертикальную полосу прокрутки, то есть содержимое обрезается. Если я установил фиксированную высоту в ListBox, появится полоса прокрутки и работает так, как ожидалось. Как я могу получить этот список для увеличения доступного пространства, а затем показать вертикальную полосу прокрутки? Этот элемент управления находится внутри StackPanel внутри сетки в главном окне. Если я упакую StackPanel внутри ScrollViewer, я получаю полосу прокрутки, после которой я буду, но это не очень хорошее решение, если я хотел бы добавить некоторые элементы управления в UserControl над ListBox (например, размер изображения "zoom" и т.д.), Поскольку я не хотели бы, чтобы они прокручивали изображения.
Спасибо!!:)
<UserControl x:Class="GalleryAdmin.UI.GalleryView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ListBox Name="itemListBox" BorderThickness="0" ItemsSource="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Background="LightGray" Margin="5" >
<StackPanel Margin="5">
<Image Source="{Binding Path=LocalThumbPath}" Height="100" />
<TextBlock Text="{Binding Path=Name}" TextAlignment="Center"></TextBlock>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
Ответы
Ответ 1
Ну, я наконец наткнулся на решение. Я добавлял свой UserControl к панели-заполнителю, которая выглядела так:
<ScrollViewer Margin="20" >
<StackPanel Name="contentPanel"></StackPanel>
</ScrollViewer>
Однако, когда я переключил его на Grid, все начало работать так, как я хотел:
<Grid Name="contentPanel" Margin="20" />
Я думаю, что это связано с тем, что StackPanel не занимает все вертикальное пространство по умолчанию, как это делает Grid.
Ответ 2
Я думаю, вам лучше пойти с переопределением ItemPanelTemplate:
<Grid>
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBoxItem>listbox item 1</ListBoxItem>
<ListBoxItem>listbox item 2</ListBoxItem>
<ListBoxItem>listbox item 3</ListBoxItem>
<ListBoxItem>listbox item 4</ListBoxItem>
<ListBoxItem>listbox item 5</ListBoxItem>
</ListBox>
Ответ 3
Все, что мне нужно было сделать, это установить следующее, и проблема исчезла:
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
Ответ 4
Я просто просматривал несколько вопросов по этой проблеме, и хотя это старый поток, этот ответ дал мне ответ, но просто для уточнения....
Макет GRID является ответом на большинство таких вопросов. Чтобы получить правильную операцию ListBox/WrapPanel для заполнения доступного пространства, следующий код выполняет трюк:
<Grid Grid.Row="1" MaxHeight="105">
<ListBox ItemTemplate="{DynamicResource StoreGroupTemplate01}" ItemsSource="{Binding StoreGroupHeader}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</Grid>
У меня есть это в другой сетке, чтобы поместить список внизу экрана (т.е. Grid.Row = "1" ), и вы можете настроить MaxHeight (или удалить его), чтобы управлять видимой областью до вертикальной появится полоса прокрутки.
Ответ 5
Поместите свой список внутри ScrollViewer, а затем установите для свойства scrollviewer VerticalScrollBarVisibility значение "Авто"
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<ListBox Name="itemListBox" BorderThickness="0" ItemsSource="{Binding}" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Background="LightGray" Margin="5" >
<StackPanel Margin="5">
<Image Source="{Binding Path=LocalThumbPath}" Height="100" />
<TextBlock Text="{Binding Path=Name}" TextAlignment="Center"></TextBlock>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</ScrollViewer>
НТН