在作用域之外停止动画

本文关键字:动画 作用域 | 更新日期: 2023-09-27 18:06:13

我有一个复杂的动画,它对视图做了一些重大的改变(改变一些控件的可见性,不透明度,背景画笔等),我想还原这个动画做了什么。Stop/Remove storyboard"应该"这样做。

然而,有一个问题:

动画在单击一个按钮时运行,但在单击另一个按钮时停止。使用这种方法,我得到以下错误:

System.Windows.Media。动画警告:6:无法执行操作,因为指定的故事板从未应用于此对象进行交互控制。Action = "删除 ' ......

我是这样做的:

<!-- button which start animation -->
<Button ...>
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <EventTrigger.Actions>
                <BeginStoryboard x:Name="storyboardUserClick">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames ...
<!-- button which should revert what animation did  --->
<Button ...>
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <EventTrigger.Actions>
                <RemoveStoryboard BeginStoryboardName="storyboardUserClick" ...

是否有一个简单的方法,最好没有后面的代码(好吧,附加属性可能是一个选项在最坏的情况下)来实现?

在作用域之外停止动画

我在这里找到了答案。

这个想法是将动画(我说的动画,但我的意思是Storyboard,甚至更具体地说BeginStoryboard)移动到RemoveStoryboard可访问的范围。就像

<Grid>
    <Button x:Name="buttonStart" ...>
    <Button x:Name="buttonStop" ...>
    <Grid.Triggers>
        <EventTrigger SourceName="buttonStart" RoutedEvent="Button.Click">
            <BeginStoryboard x:Name="storyboardUserClick">
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames ...
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger SourceName="buttonStop" RoutedEvent="Button.Click">
            <RemoveStoryboard BeginStoryboardName="storyboardUserClick" />
        </EventTrigger>
    </Grid.Triggers>
</Grid>