首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果ItemContainerStyle为style,则EventSetter不会为ListView触发

如果ItemContainerStyle为style,则EventSetter不会为ListView触发
EN

Stack Overflow用户
提问于 2011-08-25 00:36:39
回答 2查看 3.6K关注 0票数 1

WPF的相对n00b。我有一个ListView,如下:

代码语言:javascript
复制
<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中,我有以下风格:

代码语言:javascript
复制
<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没有样式。

这里我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-25 00:40:59

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

代码语言:javascript
复制
<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}"
           BasedOn="{StaticResource {x:Type ListViewItem}}">
        <EventSetter Event="MouseDoubleClick" Handler="ItemDoubleClick"/>
    </Style>
</ListView.ItemContainerStyle>

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

票数 2
EN

Stack Overflow用户

发布于 2011-08-25 00:51:12

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7179090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档