ListViewで縦と横にアイテムを配置
ListViewにWrapPanelのような配置をさせる方法。
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:vm="clr-namespace:WpfApplication1.ViewModel" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <ResourceDictionary> <CollectionViewSource x:Key="DataSource" Source="{Binding}" d:Source="{d:DesignInstance Type=vm:ItemList, IsDesignTimeCreatable=True}"/> <SolidColorBrush x:Key="ListBorder" Color="#828790"/> <!-- 基本、デフォルトのスタイルそのまま --> <Style x:Key="ListViewStyle1" TargetType="{x:Type ListView}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListView}"> <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true"> <!-- 変えたのはここのHorizontalScrollBarVisibilityとVerticalScrollBarVisibilityのみ --> <!-- リストビューの同名プロパティに連動する --> <ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"> <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> </ScrollViewer> </Border> <ControlTemplate.Triggers> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsGrouping" Value="true"/> <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/> </MultiTrigger.Conditions> <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary> </Window.Resources> <Grid> <ListView x:Name="listView" ItemsSource="{Binding Source={StaticResource DataSource}}" Style="{StaticResource ListViewStyle1}" ScrollViewer.VerticalScrollBarVisibility="Disabled"> <ListView.ItemsPanel> <ItemsPanelTemplate> <!-- HeightまたはWidthをリストビューと連動させる --> <WrapPanel Orientation="Vertical" Height="{Binding Height, ElementName=listView}"/> </ItemsPanelTemplate> </ListView.ItemsPanel> </ListView> </Grid> </Window>