【问题标题】:EventSetter doesn't fire for ListView if ItemContainerStyle is style如果 ItemContainerStyle 是样式,则不会为 ListView 触发 EventSetter
【发布时间】:2011-11-02 23:49:27
【问题描述】:

一个相对于 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,双击就不再触发。如果我删除它,它会触发,但我的 ListViewItems 没有样式。

我在这里错过了什么?

【问题讨论】:

    标签: wpf triggers styles mouseevent listviewitem


    【解决方案1】:

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

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

    【讨论】:

    • 我的理解是样式优先于它们与元素的“接近”,但这有助于我理解为什么不一定如此。谢谢。
    • @Michael - 这适用于隐式样式。元素将向上搜索视觉/逻辑树并使用找到的第一个隐式样式。但是元素上的 Style 属性胜过所有隐式 Style。
    【解决方案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 属性中的键来引用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      相关资源
      最近更新 更多