WPF触发器/样式覆盖另一个

时间:2010-05-18 05:19:11

标签: wpf xaml triggers styles datatrigger

我有一个ListView ItemContainerStyle定义如下:

                            <ListView Width="auto" 
                              SelectionMode="Single"
                              ItemContainerStyle="{StaticResource ItemContStyle}"
                               .... 

然后在baseListViewStyle中,我定义了一些基本样式以应用于我的ListView,包括Style触发器:

<Style x:Key="baseListViewStyle" TargetType="ListViewItem">
    <Setter Property="Height" Value="20" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

Trigger此处突出显示鼠标悬停在其上的行。好的。

DataTrigger上还有ListViewItem

                <Style.Triggers>
                <DataTrigger Binding="{Binding IsTestTrue}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard Storyboard="{StaticResource SomeFunkyAnimation}" />
                    </DataTrigger.EnterActions>
                </DataTrigger>

如果测试为真,则播放一个漂亮的小淡入淡出动画。这一切都有效,除非我将鼠标移动到“test is true”的行上,动画停止并显示鼠标悬停在样式上。

我可以在DataTrigger中覆盖该样式的任何想法吗?

TIA

更新

SomeFunkyAnimation为背景颜色设置动画。它的xaml在这里:

            <Style x:Key="ItemContStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource baseListViewStyle}">
            <Style.Resources>
                <Storyboard x:Key="SomeFunkyAnimation" FillBehavior="Stop">
                    <ColorAnimation Storyboard.TargetProperty="Background.Color" RepeatBehavior="Forever"  From="Red" To="Pink" Duration="0:0:3"/>
                </Storyboard>
            </Style.Resources>

MouseOver触发器在baseListViewStyle中定义。 DataTriggerItemContStyle中定义。

我尝试删除MouseOver样式触发器,但这不起作用,因为我认为Listview已经定义了默认的MouseOver样式,因此它会覆盖我的DataTrigger动画

1 个答案:

答案 0 :(得分:0)

在我解决这个问题几个小时后,我终于找到了解决方法。出于某种原因,ColorAnimation在鼠标悬停后停止动画。不知道为什么,也许是一个知道的wpf bug。解决方案是重新调整我的动画。以下是同样的事情:

                    <Storyboard x:Key="SomeFunkyAnimation" FillBehavior="Stop">
                    <DoubleAnimation Storyboard.TargetProperty="Background.Opacity" RepeatBehavior="Forever" AutoReverse="true"  From="0.2" To="1.0" Duration="0:0:1"/>
                </Storyboard>

然后同样的DataTrigger与后台的另一个Setter:

                <DataTrigger Binding="{Binding IsTestTrue}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard Storyboard="{StaticResource SomeFunkyAnimation}" />
                    </DataTrigger.EnterActions>
                    <Setter Property="Background" Value="Red" />
                </DataTrigger>

终于和平了。