【问题标题】:Remove PictureBox after time一段时间后删除图片框
【发布时间】:2020-04-21 11:57:20
【问题描述】:

我正在制作简单的游戏,我需要在一定时间后删除图片而不冻结其他所有内容。我正在做爆炸事件:

private void Explode(int x, int y)
{
  PictureBox explosion = new PictureBox();
  explosion.Image = Properties.Resources.explosion;
  explosion.SizeMode = PictureBoxSizeMode.StretchImage;
  explosion.Size = new Size(50, 50);
  explosion.Tag = "explosion";
  explosion.Left = x;
  explosion.Top = y;            
  this.Controls.Add(explosion);
  explosion.BringToFront();
}

我已经有一个运行游戏的计时器,我想使用 if 语句在持续 3 秒时删除图片。

private void timer1_Tick(object sender, EventArgs e)
{
  foreach (Control x in this.Controls) 
  {
    if (x is PictureBox && x.Tag == "explosion")
    {
      if (EXPLOSION LASTS MORE THEN 3sec)
      {
        this.Controls.Remove(x);
      }
    }
  }
}

我该怎么做?

【问题讨论】:

  • 别忘了释放控件。
  • 我知道这不是您所要求的,但是您在尝试将 WinForm PictureBoxes 用作精灵或图形元素时会遇到严重的问题;性能会很糟糕,布局和字体缩放会让你不知所措,边距和填充会让对齐成为一场噩梦,闪烁将是无法控制的。通过在 UWP 中执行此操作或使用内置 sprites 的工具包,为自己节省几天的挫败感。
  • 您可以使用 async/await 和 Task.Delay,而不是使用单个计时器来处理可能具有不同爆炸时间的多个图片框。

标签: c# .net winforms timer picturebox


【解决方案1】:

假设您可能同时有多个图片框,那么您可以使用 async/await 和 Task.Delay ,而不是使用单个计时器来处理可能具有不同爆炸时间的多个图片框:

private async void button1_Click(object sender, EventArgs e)
{
    await AddExplodablePictureBox();
}
private async Task AddExplodablePictureBox()
{
    var p = new PictureBox();
    p.BackColor = Color.Red;
    //Set the Image and other properties
    this.Controls.Add(p);
    await Task.Delay(3000);
    p.Dispose();
}

【讨论】:

  • @Madley 也许您忘记将答案标记为已接受/赞成,否则如果您需要有关此答案的更多帮助,请告诉我。
【解决方案2】:

在移除图片框之前,当然需要释放图片框资源。

但是发布时出现问题。欲了解更多信息,您可以从下面的链接中了解更多信息。

c# picturebox memory releasing problem

【讨论】:

  • 调用Dispose方法PictureBox就够了,你不需要自己处理图片,图片框帮你搞定。
  • 顺便说一句,这不是问题的唯一要点,它还询问了time ...
  • 按照设计,Dispose 用于释放非托管资源,垃圾收集器 (gc) 不会跟踪这些资源。
猜你喜欢
  • 2014-06-21
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多