Styling ListView (для пользовательского шаблона) WPF - PullRequest
1 голос
/ 23 февраля 2011

У меня есть несколько вопросов по поводу стиля ListView. Например, у меня есть стиль:

    <Style x:Key="MyListView" TargetType="{x:Type ListView}">
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
    <Setter Property="BorderBrush" Value="{StaticResource ListBorder}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Hidden"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListView}">
                <Border x:Name="PART_ControlBorder" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="0">
                   <Grid>
                        <ScrollViewer Grid.Row="1"
                            VerticalScrollBarVisibility="Hidden"
                            HorizontalScrollBarVisibility="Hidden"
                            CanKeyboardScroll="False"
                            Padding="{TemplateBinding Padding}" 
                            Focusable="false">
                            <ItemsPresenter x:Name="PART_ItemsPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </ScrollViewer>
                    </Grid>
                </Border> 
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Border x:Name="ItemBorder" CornerRadius="4" SnapsToDevicePixels="true" BorderBrush="{TemplateBinding BorderBrush}"  BorderThickness="2" Padding="1">
                    <Grid>
                        <TextBlock Text="{Binding Key}" Background="LightGray"/>
                    </Grid>
                </Border>
            </DataTemplate>
        </Setter.Value>
    </Setter>

    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background"  Value="{x:Null}" />
                        <Setter Property="BorderBrush" Value="{x:Null}" />
                        <Setter Property="Foreground" Value="Black" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Setter.Value>
    </Setter>
</Style>
  1. Почему не работают сеттеры для Backgroud и BorderBrush (ItemContainerStyle)? Мне пришлось скрыть выделение, используя переопределение для системных кистей, но это неверный путь:

    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/>
    

  2. Как можно установить BorderBrush для ItemBorder (при событии mouseOver)?

  3. Как настроить BorderBrush для ItemBorder (только для выбранных элементов)?

  4. Что мне делать, чтобы изменить стиль выбора по умолчанию?

1 Ответ

1 голос
/ 24 февраля 2011

Я нашел ответ сам. Чтобы установить стиль для ItemBorder, мне нужно было создать несколько DataTriggers и поместить их в DataTemplate:

                    <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListViewItem}},Path=IsSelected}" Value="True">
                        <Setter TargetName="ItemBorder" Property="BorderBrush" Value="Lime"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListViewItem}}, Path=IsMouseOver}" Value="True">
                        <Setter TargetName="ItemBorder" Property="BorderBrush" Value="Orange"/>
                    </DataTrigger>
                </DataTemplate.Triggers>

По поводу вопросов 1 и 4 у меня все еще нет ответа ... (Если я не буду считать способ изменения системных кистей по умолчанию)

...