为什么在后面的代码中停止动画不起作用?

时间:2015-04-16 14:08:01

标签: c# wpf animation code-behind

我在XAML中定义了动画

<Storyboard x:Key="slide">
            <DoubleAnimation Duration="00:00:30"
                             From="{Binding Width,
                                            ElementName=canvas}"
                             RepeatBehavior="Forever"
                             Storyboard.TargetName="transferCurreny"
                             Storyboard.TargetProperty="X"
                             To="{Binding ActualWidth,
                                          ElementName=txtKron,
                                          Converter={StaticResource MultiplyConverter},
                                          ConverterParameter='-1'}" />
        </Storyboard>

由以下方式触发:

<StackPanel.Triggers>
        <EventTrigger RoutedEvent="StackPanel.Loaded">
            <BeginStoryboard Storyboard="{StaticResource slide}" />
        </EventTrigger>
        <EventTrigger RoutedEvent="StackPanel.SizeChanged">
            <BeginStoryboard Storyboard="{StaticResource slide}" />
        </EventTrigger>
    </StackPanel.Triggers>

当一些文本的长度低于15时,我想停止动画。我在文本的setter后面的代码中执行:

Storyboard animation = (Storyboard)stack.Resources["slide"];

            if(value.Length > 15)
            {
                animation.Begin();
            }
            else
            {
                animation.Stop();
            }

但它不起作用,任何想法?

2 个答案:

答案 0 :(得分:0)

“isControllable”是否设为true?此故事板属性阻止例如如果设置为false(这是默认设置),则停止

编辑:可以通过代码

进行设置
animation.Begin(this.MyContainer, true);

第二个参数设置isControllable

答案 1 :(得分:0)

要允许故事板从代码隐藏中停止,它也应该在代码隐藏(使用Begin())时启动,而不是像现在那样由XAML中的事件触发。

尝试将LoadedSizeChanged事件分配给调用Begin方法的代码隐藏事件(使用容器作为第一个参数,以及第二个参数true ),然后尝试Stop,而不是使用EventTriggersBeginStoryboard

有关MSDN的更多信息:

  

要使故事板可控,请使用Begin方法并将true指定为第二个参数。

由于您使用EventTriggersBeginStoryboard启动它,Storyboard.Stop将无法执行任何操作

更新:我尚未对此进行测试,但this article上的MSDN表示您向Name提供了BeginStoryboard,您可以对其进行控制所以你也可以尝试一下。我怀疑它会“按原样”工作,我的猜测是你需要到达BeginStoryboard对象,而不是Storyboard对象,但这只是一个猜测,而且很简单修改值得一试