在XAML中设置WPF动画Storyboard的目标

6

我目前有一组按钮,我想设置触发器,以便每个按钮执行相同的动画。在XAML中,是否有一种方法可以“传递”目标到Storyboard,以便我不必为每个目标重写Storyboard?

1个回答

17

如果您没有设置明确的目标,则目标应该是应用动画的元素。我会定义一个具有触发器/动画的样式,并将该样式应用于想要展示此行为的特定按钮。例如:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Style.Resources>
        <Storyboard x:Key="OnMouseEnterStoryboard">
            <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" To="180" />
        </Storyboard>
        <Storyboard x:Key="OnMouseLeaveStoryboard">
            <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" To="0" />
        </Storyboard>
    </Style.Resources>
    <Style.Triggers>
        <EventTrigger RoutedEvent="Mouse.MouseLeave">
            <RemoveStoryboard BeginStoryboardName="OnMouseEnterStoryboard_BeginStoryboard"/>
            <BeginStoryboard x:Name="OnMouseLeaveStoryboard_BeginStoryboard" Storyboard="{StaticResource OnMouseLeaveStoryboard}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="Mouse.MouseEnter">
            <BeginStoryboard x:Name="OnMouseEnterStoryboard_BeginStoryboard" Storyboard="{StaticResource OnMouseEnterStoryboard}"/>
            <RemoveStoryboard BeginStoryboardName="OnMouseLeaveStoryboard_BeginStoryboard"/>
        </EventTrigger>
    </Style.Triggers>
    <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
    <Setter Property="RenderTransform">
        <Setter.Value>
            <RotateTransform/>
        </Setter.Value>
    </Setter>
</Style>

然后在每个按钮上,您希望它以这种方式起作用:

<Button Style="{StaticResource MyButtonStyle}" ... />

1
太棒了!我刚开始学习WPF,没想到可以使用相关的触发器和动画来应用样式。谢谢你的帮助! - jwarzech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接