0

After i applied a custom ItemContainerStyle on my listView, Highlighting a listView's item won't work as it supposed to, it only works when the mouse is over the ContentPresenter of the item as you can see in the screenshots:

Original highlight (with no style applied):

enter image description here

highlight when custom ItemContainerStyle applied

enter image description here

highlight when custom ItemContainerStyle applied (mouse over ContentPresenter)

enter image description here

ListView Style:

    <Style x:Key="DetailStyle" TargetType="{x:Type ListView}">
        <Setter Property="l:ListBoxSelector.Enabled" Value="True"/>
        <Setter Property="ItemContainerStyle" Value="{StaticResource DetailViewStyle}"/>
        <Setter Property="View">
            <Setter.Value>
                <GridView AllowsColumnReorder="True">
                    <GridViewColumn Width="30" CellTemplate="{StaticResource columnIconDT}"/>
                    <GridViewColumn Header="Name" Width="100" CellTemplate="{StaticResource columnNameDT}"/>
                    <GridViewColumn Header="Size"  Width="100" CellTemplate="{StaticResource columnSizeDT}"/>
                </GridView>
            </Setter.Value>
        </Setter>
    </Style>

ItemContainerStyle :

<Style x:Key="DetailViewStyle" TargetType="{x:Type ListViewItem}">
        <EventSetter Event="ContextMenu.ContextMenuOpening" Handler="Item_ContextMenuOpening"/>
        <EventSetter Event="PreviewMouseDoubleClick" Handler="Item_MouseDoubleClick"/>
        <Setter Property="Margin" Value="0,0,0,-1"/>
        <Setter Property="ContextMenu" Value="{DynamicResource ContextMenuForItem}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate  TargetType="{x:Type ListViewItem}">
                    <Grid HorizontalAlignment="Stretch">
                        <Border x:Name="border" BorderBrush="{x:Null}" BorderThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CornerRadius="2.5"/>
                        <GridViewRowPresenter x:Name="gridrowPresenter" Content="{TemplateBinding Property=ContentControl.Content}"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" TargetName="border">
                                <Setter.Value>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#33C1DEFF" Offset="0"/>
                                        <GradientStop Color="#41A5CDFF" Offset="1"/>
                                    </LinearGradientBrush>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="BorderBrush" TargetName="border" Value="#FF7DA2CE"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="BorderBrush" TargetName="border" Value="#FF7DA2CE"/>
                            <Setter Property="Background" TargetName="border">
                                <Setter.Value>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#97C1DEFF" Offset="0"/>
                                        <GradientStop Color="#A7A5CDFF" Offset="1"/>
                                    </LinearGradientBrush>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="Selector.IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="BorderBrush" TargetName="border" Value="#FFB4B4B4"/>
                            <Setter Property="Background" TargetName="border">
                                <Setter.Value>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#7FE5E5E5" Offset="0"/>
                                        <GradientStop Color="#B2CCCCCC" Offset="1"/>
                                    </LinearGradientBrush>
                                </Setter.Value>
                            </Setter>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

How can I fix it?

4

1 回答 1

0

您的问题是您已经用自己的定义替换了默认值ControlTemplateListViewItem并且该定义不包含在鼠标悬停时突出显示该项目的元素。

解决方案很简单...找到默认值ControlTemplate并使用缺少的元素更新您ControlTemplate的...我猜,您至少需要VisualStateManager.VisualStateGroups原始元素中的元素ControlTemplate

您可以从 MSDN 上的ListView Styles and Templates页面找到默认ControlTemplate的完整详细信息。ListViewItem


更新>>>

伙计,如果你要覆盖任何控件的一部分ControlTemplate,你可以这样做:

首先,将整个默认值复制ControlTemplate您的新文件ControlTemplate中,并确保其正常工作。然后,也只有这样,你才能开始调整内容,每次添加或删除一些东西时检查它是否仍然按预期工作。

这是一种故障安全方法,只有在你身边马虎的工作才能阻止它工作......试一试。

于 2014-01-15T15:54:31.257 回答