WPF: ListBox с WrapPanel, проблема вертикальной прокрутки

У меня есть UserControl (XAML ниже), который имеет список, который я хочу отображать изображения внутри WrapPanel, где изображения отображаются столько, сколько поместится в одной строке, а затем обернуть в следующую строку и т. д. Он работает, за исключением случаев, когда список растет выше, чем доступное пространство в окне, я не получаю вертикальную полосу прокрутки, т. е. содержимое обрезается. Если я установлю фиксированную высоту в списке, появится полоса прокрутки и будет работать так, как ожидалось. Как я могу заставить этот listbox расти до доступное пространство, а затем показать вертикальную полосу прокрутки? Этот элемент управления находится внутри StackPanel внутри сетки в главном окне. Если я оберну StackPanel внутри ScrollViewer, я получу полосу прокрутки, которую я ищу, но это не очень хорошее решение, если я хочу добавить еще несколько элементов управления в UserControl над списком (например, размер изображения "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>

5 ответов


Я думаю, вам лучше пойти с переопределением 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>


Ну, я, наконец, наткнулся на решение. Я добавлял свой UserControl в панель-заполнитель, которая выглядела так:

            <ScrollViewer Margin="20" >
                <StackPanel Name="contentPanel"></StackPanel>
            </ScrollViewer>

однако, когда я переключил его на сетку вместо этого, все начало работать так, как я хотел:

<Grid Name="contentPanel" Margin="20" />

Я думаю, что это связано с тем, что StackPanel не занимает все вертикальное пространство по умолчанию, как это делает сетка.


все, что мне нужно было сделать, это установить следующее, И проблема ушла:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">

Я просто просматривал несколько вопросов об этой проблеме, и хотя это старая тема, эта дала мне ответ, но просто для уточнения....

макет сетки-это ответ на все вопросы. Чтобы получить правильную операцию 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>

У меня это в другой сетке, чтобы поместить список в нижней части экрана (т. е.. сетка.Row= "1"), и Вы можете настроить MaxHeight (или удалите его) для управления видимой областью до появления вертикальной полосы прокрутки.


поместите список внутри ScrollViewer, а затем установите свойство VerticalScrollBarVisibility scrollviewer в "Auto"

        <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>


HTH