WPF 从代码触发动画

Posted

技术标签:

【中文标题】WPF 从代码触发动画【英文标题】:WPF trigger animation from code 【发布时间】:2016-04-09 13:43:59 【问题描述】:

我正在阅读许多类似的问答,但我没有得到我正在寻找的答案。所以,我在 Microsoft Bled 中做“家庭作业”,我真的很喜欢故事板,我知道如何通过单击按钮来触发它们,但是有人知道如何在 c# 中启动动画,例如在 if 语句中。

提前感谢您的回答和时间!

【问题讨论】:

你正在寻找这个thread。另一种方法是Storyboard sb = this.FindResource("Storyboard1") as Storyboard; if (sb != null) BeginStoryboard(sb); 谢谢,您的解决方案有效 :) 您可以将其发布为答案吗? 很高兴它有帮助。当然,我会把它作为答案发布。 :-) 这能回答你的问题吗? Call a storyboard declared in xaml from c# 这是***.com/questions/3755651/… 的骗子。接受的答案确实链接到另一个问题。 【参考方案1】:

你正在寻找这个thread。


另一种方法是:

Storyboard sb = this.FindResource("Storyboard1") as Storyboard;
if (sb != null) BeginStoryboard(sb); 

【讨论】:

对不起,因为我在这里写你的评论,但你可能知道是否可以使用相同的动画反向使用这样的代码。例如关闭和打开动画。谢谢:) 不确定这thread 是否对您有帮助,但您可以通过单击几下在混合中创建反向故事板。看看this。另一种选择是VisualStates 再次感谢,我做了反向动画 很高兴我能帮上忙。【参考方案2】:
public static class AnimationHelper

    private static void AnimateOpacity(DependencyObject target, double from, double to)
    
        var opacityAnimation = new DoubleAnimation
        
            From = from,
            To = to,
            Duration = TimeSpan.FromMilliseconds(500)
        ;

        Storyboard.SetTarget(opacityAnimation, target);
        Storyboard.SetTargetProperty(opacityAnimation, "Opacity");

        var storyboard = new Storyboard();
        storyboard.Children.Add(opacityAnimation);
        storyboard.Begin();
    

    /// <summary>
    /// Fades in the given dependency object.
    /// </summary>
    /// <param name="target">The target dependency object to fade in.</param>
    public static void FadeIn(DependencyObject target)
    
        AnimateOpacity(target, 0, 1);
    

【讨论】:

【参考方案3】:

您可以从代码隐藏中访问故事板,方法是为其命名并引用该名称以使用 Begin 方法。

<Canvas MouseLeftButtonDown="Handle_MouseDown"
  Background="Gray" Width="600" Height="500">
    <Canvas.Resources>
      <Storyboard x:Name="myStoryboard">
        <PointAnimation
          x:Name="myPointAnimation"
          Storyboard.TargetProperty="Center"
          Storyboard.TargetName="MyAnimatedEllipseGeometry"
          Duration="0:0:2"/>
      </Storyboard>
    </Canvas.Resources>

    <Path Fill="Blue">
      <Path.Data>
        <EllipseGeometry x:Name="MyAnimatedEllipseGeometry"
         Center="200,100" RadiusX="15" RadiusY="15" />
      </Path.Data>
    </Path>

</Canvas>

代码隐藏:

private void Handle_MouseDown(object sender, MouseButtonEventArgs e)

    // Retrieve current mouse coordinates.
    double newX = e.GetPosition(null).X;
    double newY = e.GetPosition(null).Y;
    Point myPoint = new Point();
    myPoint.X = newX;
    myPoint.Y = newY;
    myPointAnimation.To = myPoint;
    myStoryboard.Begin();

【讨论】:

以上是关于WPF 从代码触发动画的主要内容,如果未能解决你的问题,请参考以下文章

WPF 从 vb.net 代码开始动画给出错误

WPF之触发器

WPF DataTrigger 动画只触发一次

WPF Storyboard 动画播放完毕时触发的事件

WPF - 重复触发 LayoutUpdated 事件

WPF 调试触发器