带有 WrapPanel 的 ListView 的选择样式

Selection style for ListView with a WrapPanel

我正在使用一个 ListView 和一个 WrapPanel 作为它的 ItemsPanel。我需要更改所选项目的样式 - 使用不同的背景颜色并在所选项目周围添加边框,就像 Windows 7 的 Explorer 那样。

<ListView ItemsSource="{Binding Items}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>

    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Margin="10">
                <Rectangle Width="100" Height="100" Fill="Pink" />
                <TextBlock Text="{Binding Caption}" Margin="0,10,0,0" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Default type和Selected type简单设计ControlTemplate即可。然后你可以在ListView中的任何项目被选中时设置Selected ControlTemplate,否则保持默认类型。

    <Window.Resources>
    <ControlTemplate  x:Key="DEFAULT">
        <StackPanel Orientation="Vertical" Margin="10">
            <Rectangle Width="100" Height="100" Fill="Green" />
            <TextBlock Text="{Binding Caption}" Margin="0,10,0,0" />
        </StackPanel>
    </ControlTemplate>
    <ControlTemplate  x:Key="SELECTED_TYPE">
        <Border BorderBrush="Gray" BorderThickness="1">
        <StackPanel Orientation="Vertical" Margin="10">
            <Rectangle Width="100" Height="100" Fill="Pink" />
            <TextBlock Text="{Binding Caption}" Margin="0,10,0,0" />
        </StackPanel>
        </Border>
    </ControlTemplate>

    <Style x:Key="ListItemStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Background" Value="White"/>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Template" Value="{StaticResource SELECTED_TYPE}"/>
                <Setter Property="Background" Value="Orange"/>
            </Trigger>
            <Trigger Property="IsSelected" Value="False">
                <Setter Property="Template" Value="{StaticResource DEFAULT}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<ListView ItemsSource="{Binding Items}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
          ItemContainerStyle="{StaticResource ListItemStyle}">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>