0

ループ内の一連の画像と、それぞれのアニメーションとストーリーボードを動的に作成しました。アニメーションが完了したら、画像を削除したいと考えています。画像、アニメーション、ストーリーボードは、参照用に配列に保存されます。

アニメーションの長さは異なり、キャンバスには削除したくない要素が他にもあります。

これは、画像、アニメーション、ストーリーボードを生成するために必要なコードです。

for (int i = 0; i < apples.Length; i++)
{
  Image apple = new Image();
  apple.Source = new BitmapImage(new Uri(@"pack://application:,,,/fall;component/Resources/apple.png"));
  apple.Height = 48;
  apple.Width = 48;

  int x = r.Next(5, (int)cGame.ActualWidth - 53);
  int y = (int)cGame.ActualHeight - 48;

  Canvas.SetLeft(apple, x);
  Canvas.SetTop(apple, y);

  apples[i] = apple;

}

for(int i = 0; i < speeds.Length; i++)
{
  DoubleAnimation speed = new DoubleAnimation();
  speed.From = 0;
  speed.To = cGame.ActualHeight;
  speed.Duration = new TimeSpan(0, 0, 0, 0, r.Next(2, 6) * 500);

  speeds[i] = speed;
  speeds[i].Completed += new EventHandler(aniComplete);
}

for (int i = 0; i < sbs.Length; i++)
{
  Storyboard sb = new Storyboard();
  sb.Children.Add(speeds[i]);
  Storyboard.SetTarget(speeds[i], apples[i]);
  Storyboard.SetTargetProperty(speeds[i], new PropertyPath(TopProperty));

  sbs[i] = sb;
}

これまでに、完成したイベントを作成して、各アニメーションに添付しました。私はこれを使用して要素を削除しています:

canvas.Children.RemoveAt(1);

しかし、それは私が保持したい要素をスキップして、順番に要素を削除しただけです。アニメーションはランダムな時間に実行され、ランダムな期間を持っているため、要素が順不同でアニメーションを完了する可能性があります。

完了したイベントの特定の要素をどのように参照しますか?送信者を参照しようとしましたが、(UIElement)が機能していないようであるため、キャスト先がわかりません。

4

1 に答える 1

0

適切な変数、つまりCanvasと適切なImageコントロールをキャプチャするラムダ式Completedからイベントハンドラーを作成できます。

speeds[i].Completed += (o, e) => canvas.Children.Remove(apples[i]);

詳細については、Lambda式の「 Lambda式の変数スコープ」セクションを参照してください。

于 2013-01-13T16:45:59.167 に答える