如何在WPF中跨用户控件同步动画

mdu*_*tra 6 wpf animation synchronization

我在一个包装面板中创建了几个usercontrol.我有一个绑定到usercontrol的视图模型,我有一个动画触发到视图模型中的属性.非常简单的切换颜色,从红色到透明,以模拟闪烁.

<Storyboard x:Key="alertAnimation" RepeatBehavior="Forever" AutoReverse="True" >
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
                                  Storyboard.TargetName="TileBorder"
                                  BeginTime="00:00:00"
                                  RepeatBehavior="Forever"
                                  AutoReverse="True"
                                  >
        <DiscreteColorKeyFrame Value="Red"/>
        <DiscreteColorKeyFrame KeyTime="00:00:00.500" Value="Transparent" />
    </ColorAnimationUsingKeyFrames>

</Storyboard>
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,由于我异步加载多个用户控件,因此闪烁的动画不会同步,因此它们会在不同的时间闪烁.现在要求屏幕上闪烁的任何内容都需要以相同的速率/时间闪烁.有没有办法同步这些动画?我似乎无法找到适合我想要完成的任何地方的例子.有没有办法使用ParallelTimeline,添加所有动画并从单个控制器启动/停止它们?任何例子如何实现这一目标?

编辑4/20在style.xaml文件中定义动画并拥有一个"全局"故事板,每个控件添加其"闪烁"动画并使主UI启动故事板会更好吗?

pap*_*zzo 0

显然,这需要修改,但尝试颜色过渡的持续时间为 0 可能会给您带来更少的开销。但也可能不会。只是想尝试一下。

    <Rectangle Name="MyRectangle" Width="100" Height="100">
        <Rectangle.Fill>
            <SolidColorBrush x:Name="MySolidColorBrush" Color="Blue" />
        </Rectangle.Fill>
        <Rectangle.Triggers>
            <EventTrigger RoutedEvent="Rectangle.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation 
            Storyboard.TargetName="MyRectangle"
            Storyboard.TargetProperty="Width"
            From="100" To="200" Duration="0:0:1" />

                        <ColorAnimation 
            Storyboard.TargetName="MySolidColorBrush"
            Storyboard.TargetProperty="Color"
            From="Blue" To="Red" BeginTime="0:0:1"  Duration="0:0:0"  />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Rectangle.Triggers>
    </Rectangle>
Run Code Online (Sandbox Code Playgroud)