2012-08-14 108 views
1

我正在使用WPF和MVVM。我有一个故事板,在ViewModel的某些状态下触发一个彩色动画。如果处于“增加”状态,故事板会使物品闪烁一次绿色。如果处于“减少”状态,故事板将闪烁一次红色。如果处于“未更改”状态,则不会发生任何事情。触发属性更改时故事板动画未完成

我遇到的问题是,如果出于任何原因状态在动画运行时发生变化,动画将停止。例如。我进入增加状态,动画开始闪烁绿色。然后,相同的属性更改为未更改,动画立即停止而不结束。

有没有办法使动画运行其过程,即使它触发的值已经改变了?

<Storyboard x:Key="ValueIncreasedStoryboard" AutoReverse="True"> 
    <ColorAnimation 
     Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
     To="{StaticResource ResourceKey=IncreasedColor}" 
     Duration="0:0:0.4" /> 
    <ColorAnimation 
     Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" 
     To="{StaticResource ResourceKey=IncreasedColor}" 
     Duration="0:0:1" /> 
</Storyboard> 

<DataTrigger Binding="{Binding Path=Status}" Value="{x:Static ViewModel:Status.Increased}"> 
    <DataTrigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource ValueIncreasedStoryboard}" x:Name="ValueIncreased_Storyboard"/> 
    </DataTrigger.EnterActions> 
    <DataTrigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="ValueIncreased_Storyboard"/> 
    </DataTrigger.ExitActions> 
</DataTrigger> 

SOLUTION: 删除退出操作和设置填充行为停止的组合。

+0

当然,只是不要使用触发器,并用手执行它 – dvvrd 2012-08-14 19:38:26

+0

触发器处于多次使用的样式。 – user815512 2012-08-14 19:43:55

+0

如果删除'ExitActions',会发生什么情况? – dvvrd 2012-08-14 19:58:56

回答

0

删除此行:

<DataTrigger.ExitActions> 
    <RemoveStoryboard BeginStoryboardName="ValueIncreased_Storyboard"/> 
</DataTrigger.ExitActions> 

然后订阅Storyboard.Completed事件。您可以使用EventSetter从XAML中完成。 在已完成的事件处理程序中删除故事板。

+0

不幸的是,这是行不通的。 RemoveStoryboard动作实际上不需要运行吗?我找不到实际触发该行为的方法。 – user815512 2012-08-14 21:13:19

+0

我甚至不认为在Completed活动中发生的故事板是带故障的故事板。我也尝试了storyboard.Remove()。 – user815512 2012-08-14 21:30:55

+0

好的,调试器是否停止在Completed事件处理程序的断点处?我还有一个想法是编写由Completed事件执行的事件触发器,并在其EnterActions中使用RemoveStoryboard。但它似乎是不可能的:( – dvvrd 2012-08-14 21:41:14