根据属性值切换动画

时间:2009-09-03 12:37:51

标签: wpf animation mvvm

我有一个带有State属性的ViewModel和一个带有背景画笔的简单矩形的Datatemplate。每当ViewModel的状态发生变化时,我想触发一个动画,该动画以画笔当前所具有的颜色开始,并将其动画为表示新状态的新颜色。我用datatriggers完成了这个。它几乎可以工作。我唯一的问题是,它不是以画笔当前所具有的颜色开始,而是以未动画的基色来开始。这可能是因为我在退出操作中删除了动画。但如果我不这样做,我只能动画一次。我错过了什么?

我遇到的另一个问题是:我需要在很多不同的数据模板中使用这种状态动画,它总是绑定到同一属性(“状态”),并且它们总是为SolidColorbrush设置动画。有没有办法可以使用资源和/或样式在datatemplates中共享这些数据触发器动画?

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=State}" Value="Active">
        <DataTrigger.EnterActions>
            <BeginStoryboard x:Name="activeStoryboard" HandoffBehavior="SnapshotAndReplace">
                <Storyboard>
                    <ColorAnimation To="Green" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" />
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.EnterActions>
        <DataTrigger.ExitActions>
            <RemoveStoryboard BeginStoryboardName="activeStoryboard" />
        </DataTrigger.ExitActions>
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=State}" Value="Error">
        <DataTrigger.EnterActions>
            <BeginStoryboard x:Name="errorStoryboard" HandoffBehavior="SnapshotAndReplace">
                <Storyboard>
                    <ColorAnimation To="Red" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" />
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.EnterActions>
        <DataTrigger.ExitActions>
            <RemoveStoryboard BeginStoryboardName="errorStoryboard" />
        </DataTrigger.ExitActions>
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=State}" Value="Wait">
        <DataTrigger.EnterActions>
            <BeginStoryboard x:Name="waitStoryboard" HandoffBehavior="SnapshotAndReplace">
                <Storyboard>
                    <ColorAnimation To="Yellow" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" />
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.EnterActions>
        <DataTrigger.ExitActions>
            <RemoveStoryboard BeginStoryboardName="waitStoryboard" />
        </DataTrigger.ExitActions>
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=State}" Value="Inactive">
        <DataTrigger.EnterActions>
            <BeginStoryboard x:Name="inactiveStoryboard" HandoffBehavior="SnapshotAndReplace">
                <Storyboard>
                    <ColorAnimation To="Gray" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" />
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.EnterActions>
        <DataTrigger.ExitActions>
            <RemoveStoryboard BeginStoryboardName="inactiveStoryboard" />
        </DataTrigger.ExitActions>
    </DataTrigger>
</DataTemplate.Triggers>

1 个答案:

答案 0 :(得分:0)

我无法完全回答你的问题,但我至少可以指出你可以分享故事板,但我不确定DataTriggers本身。但有趣的是。我想知道关于Bindings的同样的事情,因为我经常有多次重复使用单个绑定,并试图找到一种方法来声明它一次并至少在单个Control或XAML ResourceDictionary中重用。

相关问题