Wpf 事件设置器不';如果ItemContainerStyle为style,则不会激发ListView

Wpf 事件设置器不';如果ItemContainerStyle为style,则不会激发ListView,wpf,triggers,styles,mouseevent,listviewitem,Wpf,Triggers,Styles,Mouseevent,Listviewitem,与WPF相对的n00b。我有一个列表视图,因此: ... 在我的app.xaml中,我有以下几种风格: <Style TargetType="{x:Type ListView}"> <Setter Property="ItemContainerStyle" Value="{DynamicResource ListViewItemStyle}"/> </Style> <Style x:Key="ListViewItemStyle" Target

与WPF相对的n00b。我有一个
列表视图
,因此:


...
在我的app.xaml中,我有以下几种风格:

<Style TargetType="{x:Type ListView}">
    <Setter Property="ItemContainerStyle" Value="{DynamicResource ListViewItemStyle}"/>
</Style>
<Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <Border x:Name="Border" Padding="4">
                    <GridViewRowPresenter x:Name="ItemText" 
                                          TextBlock.FontSize="14" TextBlock.Foreground="{x:Static SystemColors.ControlDarkDarkBrush}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </Border>

                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"/>
                            <Condition Property="IsSelected" Value="False"/>
                        </MultiTrigger.Conditions>

                        <Setter TargetName="ItemText" Property="TextBlock.Foreground" Value="{x:Static SystemColors.WindowTextBrush}"/>
                    </MultiTrigger>

                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="{x:Static SystemColors.HighlightBrush}"/>
                        <Setter TargetName="ItemText" Property="TextBlock.Foreground" Value="{x:Static SystemColors.HighlightTextBrush}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

但是一旦我设置了
ItemContainerStyle
,双击就不再触发了。如果我删除它,它将激发,但我的
ListViewItem
s未设置样式


这里缺少什么?

您的本地资源被应用程序资源样式覆盖,该样式更改了ListView的ItemContainerStyle属性。我建议直接在
ListView.ItemContainerStyle
上设置样式,并基于现有样式:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}"
           BasedOn="{StaticResource {x:Type ListViewItem}}">
        <EventSetter Event="MouseDoubleClick" Handler="ItemDoubleClick"/>
    </Style>
</ListView.ItemContainerStyle>


(这假设了隐式样式,因此要么删除应用程序资源中样式的键,要么直接使用
BasedOn
属性中的该键引用它)

要扩展H.B.的答案,元素可以具有隐式样式,也可以直接设置其样式属性(我称之为显式样式),但不是两者都有。一旦您在ListViewItem上设置了Style属性,它将不再使用您拥有的任何隐式样式


由于ListView.ItemContainerStyle只是设置ListViewItem.Style属性的一种简单方法,因此它具有与您定义的隐式样式短路相同的效果。

我的理解是,样式的优先级越高,越接近元素,但这有助于我理解为什么不一定如此。谢谢你。@Michael-对于含蓄的风格来说是这样的。元素将搜索视觉/逻辑树,并使用找到的第一个隐式样式。但是元素上的Style属性胜过所有隐式样式。