У меня есть приложение WPF, в котором я создал несколько компонентов, чтобы больше походить на стиль Windows 7 по умолчанию. Теперь я хотел сделать то же самое для ListView, поскольку стиль по умолчанию (даже в Windows 7) выглядит не очень похожим.ListView потеряет отображение GridView при применении ItemContainerStyle
В элементе представления ListView есть GridView с некоторыми GridViewColumns. XAML для ListView без какого-либо стиля применяется как таковой:
<ListView ItemsSource="{Binding Series.ServiceSeries.Weeks}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="" DisplayMemberBinding="{Binding WeekNumber}" />
<GridViewColumn Header="Start date" DisplayMemberBinding="{Binding Path=., Converter={StaticResource WeekConverter}, ConverterParameter=start}" />
<GridViewColumn Header="Track" DisplayMemberBinding="{Binding Path=., Converter={StaticResource WeekConverter}, ConverterParameter=track}" />
<GridViewColumn Header="Race length" DisplayMemberBinding="{Binding Path=., Converter={StaticResource WeekConverter}, ConverterParameter=length}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
Похоже это на Windows 7, как вы можете видеть цвета немного неправильно: 1 http://www.nickthissen.nl/Images/Persistent/tmp3DCB.png
Поэтому я решил применить пользовательский стиль для ItemContainerStyle в ListView. Стиль является почти точной копией стиля я использую для списка Box, за исключением замены ListBoxItem на ListViewItem:
<Style TargetType="{x:Type ListViewItem}" x:Key="ListViewItemStyle">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Border x:Name="Border" CornerRadius="3" BorderThickness="1" SnapsToDevicePixels="True">
<Border x:Name="InnerBorder" CornerRadius="2" BorderBrush="Transparent" Background="Transparent"
BorderThickness="1" Padding="3,1" SnapsToDevicePixels="True">
<ContentPresenter />
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="BorderBrush"
Value="{StaticResource ListboxItemHoverBorder}" />
<Setter TargetName="InnerBorder" Property="BorderBrush"
Value="{StaticResource ListboxItemHoverInnerBorder}" />
<Setter TargetName="InnerBorder" Property="Background"
Value="{StaticResource ListboxItemHoverBackground}" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="BorderBrush"
Value="{StaticResource ListboxItemSelectedBorder}" />
<Setter TargetName="InnerBorder" Property="BorderBrush"
Value="{StaticResource ListboxItemSelectedInnerBorder}" />
<Setter TargetName="InnerBorder" Property="Background"
Value="{StaticResource ListboxItemSelectedBackground}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="false" />
</MultiTrigger.Conditions>
<Setter TargetName="Border" Property="BorderBrush"
Value="{StaticResource ListboxItemInactiveBorder}" />
<Setter TargetName="InnerBorder" Property="BorderBrush"
Value="{StaticResource ListboxItemInactiveInnerBorder}" />
<Setter TargetName="InnerBorder" Property="Background"
Value="{StaticResource ListboxItemInactiveBackground}" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
После применения этого стиля в ItemContainerStyle свойство ListView, то ListView выглядит это: 2 http://www.nickthissen.nl/Images/Persistent/tmpCCB2.png
Как вы можете видеть, цвет теперь намного лучше, но он полностью утратил свой стиль отображения GridView, вместо того, чтобы он полностью игнорирует столбцы и просто вставив ToString представления объектов (который я не сделал переопределить, чтобы он возвращал полное имя типа).
Я не понимаю, почему это происходит, и ничего не происходит, кроме удаления ItemContainerStyle. Должно быть что-то не так с моим стилем, но я не могу найти проблему ...
Может ли кто-нибудь увидеть, что я сделал не так, и как я смогу вернуть стиль GridView? Благодаря!
Где эти ребята пришли? {StaticResource ListboxItemHoverBorder} – Mark