WPF 路径动画

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14020798/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 06:45:55  来源:igfitidea点击:

WPF path animation

c#wpfanimation

提问by SysAdmin

I have created the following XAML

我创建了以下 XAML

<Canvas Background="Gray" Margin="10">    
    <Ellipse x:Name="Node1" Width="20" Height="20" Fill="AliceBlue" Canvas.Left="38" Canvas.Top="136" />
    <Ellipse x:Name="Node2" Width="20" Height="20" Fill="AliceBlue" Canvas.Left="290" Canvas.Top="136" />
    <Ellipse x:Name="object" Width="10" Height="20" Fill="Black" Canvas.Left="43" Canvas.Top="125" />
    <Path Stroke="Black" StrokeThickness="1">
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigureCollection>
                        <PathFigure StartPoint="50,145">
                            <PathFigure.Segments>
                                <PathSegmentCollection>
                                    <LineSegment Point="100,100" />
                                    <LineSegment Point="250,100" />
                                    <LineSegment Point="300,145" />
                                </PathSegmentCollection>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathFigureCollection>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
</Canvas>

As you can see, I have created 2 elliptical Nodes. A path connecting the two nodes and an object sitting at node 1. All I want to do here is to animate the object at node1 along the path towards node2.

如您所见,我创建了 2 个椭圆节点。一条连接两个节点的路径和一个位于节点 1 的对象。我在这里要做的就是沿着指向节点 2 的路径为节点 1 处的对象设置动画。

I am trying to do the animation using codeas I want the animation to happen on click of the node2. I have been struggling with DoubleAnimation, MatrixAnimation,storyboard..Very confusing. Please share you knowledge on how to achieve this. I am hoping the same code would work with curves and complex paths.

我正在尝试使用代码制作动画,因为我希望动画在单击 node2 时发生。我一直在为 DoubleAnimation、MatrixAnimation、storyboard 苦苦挣扎……非常混乱。请分享您关于如何实现这一目标的知识。我希望相同的代码可以处理曲线和复杂的路径。

回答by StaWho

You need DoubleAnimationUsingPath(ref):

你需要DoubleAnimationUsingPath(参考)

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="WpfApplication1.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">
    <Window.Resources>
        <Storyboard x:Key="Storyboard1">
            <DoubleAnimationUsingPath Duration="0:0:2" Source="X" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="object">
                <DoubleAnimationUsingPath.PathGeometry>
                    <PathGeometry Figures="M2,10 L52,-35 L202,-35 L252,10"/>
                </DoubleAnimationUsingPath.PathGeometry>
            </DoubleAnimationUsingPath>
            <DoubleAnimationUsingPath Duration="0:0:2" Source="Y" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="object">
                <DoubleAnimationUsingPath.PathGeometry>
                    <PathGeometry Figures="M2,10 L52,-35 L202,-35 L252,10"/>
                </DoubleAnimationUsingPath.PathGeometry>
            </DoubleAnimationUsingPath>
        </Storyboard>
    </Window.Resources>

    <Grid x:Name="LayoutRoot">
        <Canvas Background="Gray" Margin="10">    
    <Ellipse x:Name="Node1" Width="20" Height="20" Fill="AliceBlue" Canvas.Left="38" Canvas.Top="136" />
    <Ellipse x:Name="Node2" Width="20" Height="20" Fill="AliceBlue" Canvas.Left="290" Canvas.Top="136" />
    <Ellipse x:Name="object" Width="10" Height="20" Fill="Black" Canvas.Left="43" Canvas.Top="125" RenderTransformOrigin="0.5,0.5" MouseLeftButtonDown="object_MouseLeftButtonDown" >
        <Ellipse.RenderTransform>
            <TransformGroup>
                <ScaleTransform/>
                <SkewTransform/>
                <RotateTransform/>
                <TranslateTransform/>
            </TransformGroup>
        </Ellipse.RenderTransform>
    </Ellipse>
    <Path Stroke="Black" StrokeThickness="1">
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigureCollection>
                        <PathFigure StartPoint="50,145">
                            <PathFigure.Segments>
                                <PathSegmentCollection>
                                    <LineSegment Point="100,100" />
                                    <LineSegment Point="250,100" />
                                    <LineSegment Point="300,145" />
                                </PathSegmentCollection>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathFigureCollection>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
</Canvas>
</Grid>
</Window>

Then to invoke from code:

然后从代码调用:

private void object_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    Storyboard animation = this.TryFindResource("Storyboard1") as Storyboard;
    animation.Begin();
}


[EDIT] I think you're missing critical tool here: Blend. As for creating animation in code, if you look at XAML elements, think about them as serialized classes, which can be reflected in code, i.e.

[编辑] 我认为您在这里缺少关键工具:Blend。至于在代码中创建动画,如果你看XAML元素,把它们想成是序列化的类,可以在代码中体现,即

    Storyboard sb = new Storyboard();
    DoubleAnimationUsingPath ani_2 = new DoubleAnimationUsingPath();
    ani_2.Duration = new Duration(new TimeSpan(0, 0, 2));

    PathGeometry pg = new PathGeometry();
    pg.Figures.Add(new PathFigure());

    ani_2.PathGeometry.AddGeometry(pg);

etc. It is however (IMAO) fairly painful to create those straight from code. It all really depends on the application. Have a look herefor a starting point on Blend.

等等。然而(IMAO)直接从代码创建这些是相当痛苦的。这完全取决于应用程序。看看这里的共混物的起点。