如果ItemContainerStyle是样式,则EventSetter不会为ListView触发

时间:2011-08-24 16:36:39

标签: wpf triggers styles mouseevent listviewitem

WPF的相对n00b。我有ListView因此:

<ListView>
    <ListView.View>
        <GridView>
            ...
        </GridView>
    </ListView.View>
    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <EventSetter Event="MouseDoubleClick" Handler="ItemDoubleClick"/>
        </Style>
    </ListView.Resources>
</ListView>

在我的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没有样式。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

您的本地资源被应用程序资源样式覆盖,该样式更改了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属性中的该键直接引用它)

答案 1 :(得分:0)

要扩展H.B.的答案,元素可以具有隐式样式,也可以直接设置它的Style属性(我称之为显式样式),但不能同时设置它们。只要在ListViewItem上设置Style属性,它就不再使用任何隐式样式。

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