3

これは、形状のY2プロパティをアニメーション化する簡単なプログラムです。メソッドを使用して をターゲットにしてLineいることに注意してください。このプログラムは正常に動作します。SetTargetLine

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SoGeneratingAnimatedLine
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var canvas = new Canvas();

            Content = canvas;

            var sb = new Storyboard();

            var line = new Line()
            {
                X1 = 10, Y1 = 10,
                X2 = 90, Y2 = 10,
                Stroke = Brushes.Black,
                StrokeThickness = 2
            };

            canvas.Children.Add(line);

            var animation = new DoubleAnimation(10, 90, new Duration(TimeSpan.FromMilliseconds(1000)));

            sb.Children.Add(animation);

            Storyboard.SetTarget(animation, line);
            Storyboard.SetTargetProperty(animation, new PropertyPath(Line.Y2Property));

            MouseDown += (s, e) => sb.Begin(this);
        }
    }
}

a の であるEndPointa のをアニメーション化する同様のプログラムを次に示します。LineGeometryDataPath

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SoGeneratingAnimatedLine
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var canvas = new Canvas();

            Content = canvas;

            var sb = new Storyboard();

            var lineGeometry = 
                new LineGeometry(new Point(10, 10), new Point(90, 10));

            var path = new Path()
            {
                Stroke = Brushes.Black,
                StrokeThickness = 2,
                Data = lineGeometry
            };

            canvas.Children.Add(path);

            var animation =
                new PointAnimation(
                    new Point(90, 10),
                    new Point(90, 90),
                    new Duration(TimeSpan.FromMilliseconds(1000)));

            sb.Children.Add(animation);

            Storyboard.SetTarget(animation, lineGeometry);
            Storyboard.SetTargetProperty(animation, new PropertyPath(LineGeometry.EndPointProperty));

            MouseDown += (s, e) => sb.Begin(this);
        }
    }
}

この 2 番目のバージョンは機能しませ。ただし、次の行を置き換えると:

Storyboard.SetTarget(animation, lineGeometry);

と:

RegisterName("geometry", lineGeometry);
Storyboard.SetTargetName(animation, "geometry");

その後、アニメーションが実行されます。

SetTarget2 番目のプログラムのバージョンが機能しないのはなぜですか? /コンボSetTargetの代わりに使用できるのはいつですか? 2つのアプローチの違いは何ですか?RegisterNameSetTargetName

4

2 に答える 2

1

ストーリーボードはまったく必要ありません。LineGeometry でBeginAnimationを直接呼び出すだけです。

lineGeometry.BeginAnimation(LineGeometry.EndPointProperty, animation);
于 2012-11-04T12:28:16.990 に答える
0

コードで作成されたアプリケーションのアニメーション ストーリーボードを正しく接続するには、RegisterName を呼び出す必要があります。これは、主要なストーリーボード プロパティの 1 つであるTargetNameが、ターゲット要素への参照を取得する代わりに、ランタイム名ルックアップを使用するためです。これは、コードからの参照によってその要素にアクセスできる場合でも当てはまります。

于 2019-07-15T13:17:40.110 に答える