Windows 8 ListView с горизонтальным потоком элементов

Как я могу заставить ListItems внутри окна ListView ListView горизонтально. Поведение по умолчанию - вертикальное, но я хочу показать список в горизонтальном потоке, чтобы он выглядел как панорама.

Я попробовал GridView, который поддерживает горизонтальную компоновку, но существует ограничение на высоту элемента, которое не отображает полное содержимое элемента для элементов с большим текстом.

Ответ 1

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

<ListView
    Height="500"
    VerticalAlignment="Center"
    ScrollViewer.HorizontalScrollBarVisibility="Auto"
    ScrollViewer.VerticalScrollBarVisibility="Disabled"
    ScrollViewer.HorizontalScrollMode="Enabled"
    ScrollViewer.VerticalScrollMode="Disabled"
    ScrollViewer.ZoomMode="Disabled"
    SelectionMode="None">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsStackPanel
                Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>

- это дает горизонтальную панель и правые полосы прокрутки для горизонтальной прокрутки.

Как ListView, так и GridView могут вызывать проблемы при получении больших элементов. Я думаю, что по умолчанию элементы могут быть отсортированы по размеру первого добавленного элемента. Вы можете установить этот размер вручную, хотя:

<ListView.ItemContainerStyle>
    <Style
        TargetType="ListViewItem"><!-- note - for GridView you should specify GridViewItem, for ListBox - ListBoxItem, etc. -->
        <Setter
            Property="Height"
            Value="200" /> <!-- this is where you can specify the size of your ListView items -->
        <Setter
            Property="Width"
            Value="350" />
    </Style>
</ListView.ItemContainerStyle>

- обратите внимание, что все элементы должны быть одного размера.

- также обратите внимание - я изменил этот ответ, заменив StackPanel на ItemsStackPanel, который виртуализирован, поэтому он должен повысить производительность и снизить использование памяти для больших наборов данных, но PLEASE - не создавать макеты с большими горизонтально прокручиваемыми списками. Они могут быть хорошим решением в некоторых очень ограниченных сценариях, но в большинстве случаев они сломают много хороших шаблонов пользовательского интерфейса и упрощают использование вашего приложения.

Ответ 2

Вы также можете инкапсулировать подход Filips, используя стиль:

   <Style TargetType="ListView" x:Key="VerticalListView">
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" />

        <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Enabled" />
        <Setter Property="ScrollViewer.VerticalScrollMode" Value="Disabled" />

        <Setter Property="ScrollViewer.ZoomMode" Value="Disabled" />
        <Setter Property="SelectionMode" Value="None" />

        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel VerticalAlignment="Top" Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>

        <Setter Property="ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="ListViewItem">
                    <Setter Property="Height" Value="400" />
                </Style>
            </Setter.Value>
        </Setter>
    </Style>

Примените его к списку ListView по мере необходимости:

<ListView Style="{StaticResource VerticalListView}" />

Ответ 3

Я бы предпочел использовать стиль, но вам нужно будет тщательно изменить ориентацию панели. Перед первым прохождением визуального макета панель управления элементами не будет создана и, следовательно, не будет доступна для изменения. Вам нужно будет найти стратегию обработки начальной настройки, если она отличается от одной строки вашего Xaml. Возможно, также назначьте ItemPanelTemplate с помощью установщика стиля.