Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在完成事件中引用动态创建的映像_C#_Wpf - Fatal编程技术网

C#在完成事件中引用动态创建的映像

C#在完成事件中引用动态创建的映像,c#,wpf,C#,Wpf,我已经在一个循环中动态创建了一系列图像,以及每个图像的动画和故事板,我希望在动画完成后删除图像。图像、动画和故事板存储在阵列中以供参考 动画有不同的持续时间,画布上还有其他我不想删除的元素 这是我用来生成图像、动画和故事板的代码: for (int i = 0; i < apples.Length; i++) { Image apple = new Image(); apple.Source = new BitmapImage(new Uri(@"pack://applicatio

我已经在一个循环中动态创建了一系列图像,以及每个图像的动画和故事板,我希望在动画完成后删除图像。图像、动画和故事板存储在阵列中以供参考

动画有不同的持续时间,画布上还有其他我不想删除的元素

这是我用来生成图像、动画和故事板的代码:

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;
}
但它只是按顺序删除了元素,跳过了我想要保留的元素。动画以随机时间运行,并且具有随机持续时间,因此很容易出现元素无序完成动画的情况


如何引用已完成事件中的特定元素?我尝试引用发件人,但我不确定应该将其强制转换为什么(UIElement),因为(UIElement)似乎不起作用。

您可以从捕获适当变量(即画布和适当的图像控件)的

speeds[i].Completed += (o, e) => canvas.Children.Remove(apples[i]);
有关详细信息,请参阅中的Lambda表达式中的变量范围部分

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