1

私はSells/Griffithsの「ProgrammingWPF」を通じて自分自身にWPFを教えてきました。それは素晴らしいリソースだと思いましたが、彼らが紹介してくれた概念のいくつかを取り入れて、さらに一歩進んでいます。そして、私がやろうとしていることを達成するためにピースを組み合わせる方法について、概念的な問題に直面しています。

この演習では、自己終了アニメーションを作成しようとしています。FrameworkElement■イベントによって作成され、アニメーションを実行してから、自分自身を削除します。FrameworkElementAnimation.Completedイベントから親にコールバックする方法を理解するのに問題があります。

DoubleAnimation私はもともと、含まれておらず、の一部ではないを使用してこの質問をしましたStoryboard。その後、を追加しStoryboardStoryboardと長方形のリソースを作成して、簡単に再利用できるようにしました。

これが私がこれまでに持っているものです:
.xaml:

<Window.Resources>
    <Storyboard x:Key="GrowSquare" x:Shared="False">
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" By="-50" Duration="0:0:2"/>
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" By="-50" Duration="0:0:2"/>
        <DoubleAnimation Storyboard.TargetProperty="(Ellipse.Width)" By="100" Duration="0:0:2"/>
        <DoubleAnimation Storyboard.TargetProperty="(Ellipse.Height)" By="100" Duration="0:0:2"/>
    </Storyboard>
    <Rectangle x:Key="MyRect" x:Shared="False" Width="20" Height="20">
    </Rectangle>
</Window.Resources>
<Canvas x:Name="myCanvas" MouseMove="myCanvas_MouseMove" Background="White"/>

.cs:

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            lastFire = DateTime.Now;
        }

        DateTime lastFire;

        private void myCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            DateTime nowTime = DateTime.Now;
            TimeSpan T = nowTime.Subtract(lastFire);

            if (T.TotalMilliseconds > 200)
            {
                lastFire = nowTime;
                Random Rand = new Random();

                Rectangle myRect = (Rectangle)FindResource("MyRect");
                myRect.Fill = new SolidColorBrush(Color.FromRgb((byte)Rand.Next(256), (byte)Rand.Next(256), (byte)Rand.Next(256)));
                Point myLoc = e.GetPosition(myCanvas);
                Canvas.SetLeft(myRect, myLoc.X - 10);
                Canvas.SetTop(myRect, myLoc.Y - 10);
                myCanvas.Children.Add(myRect);

                Storyboard SB = (Storyboard)FindResource("GrowSquare");
                SB.Completed += new EventHandler(SB_Completed);
                SB.Begin(myRect);
            }

        }

        void SB_Completed(object sender, EventArgs e)
        {
            myCanvas.Children.RemoveAt(0);
        }
    }

これは機能しますが、私が望む方法ではありません。キャンバスは空であり、すべてのアニメーションは同じ長さであるため、アニメーションが終了すると、常にキャンバスの最初の子で呼び出されたものになります。

ただし、ランダムな時間のアニメーションを実装したいと思います。つまり、アニメーションは常に同じ順序で開始および終了するとは限りません。どういうわけか、SB_Completedイベントで、呼び出されていたコントロールにアクセスしたいのですが、まだパスが見つからないようです。

SB_Completedイベントを呼び出すMedia.Animation.ClockGroupから、アニメーションが呼び出されているコントロールに移動する方法はありますか?

4

1 に答える 1

5

イベントハンドラーを割り当てる行を次のように変更します。

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
于 2009-04-28T18:17:17.020 に答える