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

У меня есть UserControl (XAML ниже), у которого есть ListBox, в котором я хочу отображать изображения внутри WrapPanel, где изображений отображается столько, сколько поместится в одной строке, а затем переносится на следующую строку и т. Д. Он работает, за исключением случаев, когда ListBox растет выше доступного места в окне, я не получаю вертикальную полосу прокрутки, т. е. содержимое обрезается. Если я установил фиксированную высоту для ListBox, полоса прокрутки появится и будет работать должным образом. Как я могу увеличить этот список до доступного места, а затем отобразить вертикальную полосу прокрутки? Этот элемент управления находится внутри StackPanel внутри сетки в главном окне. Если я заверну StackPanel в ScrollViewer, я получу полосу прокрутки, которая мне нужна, но это не совсем хорошее решение, если я хотел добавить еще несколько элементов управления в UserControl над ListBox (например, размер изображения «масштабирование» и т. Д.), Поскольку я не хотел бы, чтобы они прокручивали изображения.

Спасибо!! :)

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


person kodbuse    schedule 04.05.2009    source источник


Ответы (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>

person Eric Ouellet    schedule 07.02.2013
comment
Отключение горизонтальной прокрутки помогло мне !! Спасибо! - person 321X; 22.09.2015

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

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

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

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

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

person kodbuse    schedule 11.05.2009
comment
У меня был мой ListBoxWrapPanel) внутри StackPanel внутри Grid, и я наблюдал такое же поведение. Удаление слоя StackPanel решило проблему. Спасибо. - person i_am_jorf; 17.01.2011
comment
У меня было две сетки и список, вложенных в UserControl <UserControl> <Grid> <Grid> <ListBox> Удаление дубликатов сетки решило проблему. - person Vinay Patil; 19.11.2014

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

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
person Eternal21    schedule 02.12.2013

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

Макет 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 (или удалить его), чтобы контролировать видимую область, прежде чем вертикальная полоса прокрутки будет объявиться.

person CHJ124    schedule 23.09.2013

Поместите свой список в ScrollViewer, а затем установите для свойства VerticalScrollBarVisibility средства просмотра прокрутки значение «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

person Anand Shah    schedule 04.05.2009
comment
Спасибо, но, к сожалению, это не сработает. Это вообще не имеет значения. На самом деле я уже пробовал это. Наверное, следовало упомянуть об этом. Это похоже на то, что UserControl не знает, какой размер ему доступен ?? - person kodbuse; 04.05.2009