通过代码创建多个picturebox -只有一个是可见的

本文关键字:有一个 -只 picturebox 代码 创建 | 更新日期: 2023-09-27 18:01:37

我正在尝试使用以下代码绘制大量图像实例:

PictureBox[] sprites = new PictureBox[100];
private void Game_Load(object sender, EventArgs e)
{
    PictureBox mainSprite = new PictureBox();
    Bitmap img = new Bitmap(SpriteTest.Properties.Resources.Image); //Load a png image
    mainSprite.Size = new Size(16, 16);
    mainSprite.Image = img;
    for(var i = 0; i < sprites.Length; i++)
    {
        sprites[i] = mainSprite;
        //Keeping it simple for now with a single row of sprites
        sprites[i].Location = new Point(i * 16, 8); 
    }
    Game.ActiveForm.Controls.AddRange(sprites);
}

在运行代码时,只显示最后一个图像。在调试代码时,一切似乎都按预期工作。我还可以验证位置实际上正在更新。

我还尝试在for循环中使用以下代码以不同的方式添加控件(没有运气);

this.Controls.Add(sprites[i]);

我多次遇到这个问题,特别是当我试图以类似的方式创建许多groupbox时。我在网上搜索了几个小时,试图找到一个解决方案,但没有什么能解决这个问题。

通过代码创建多个picturebox -只有一个是可见的

您实际上只创建了一个PictureBox的实例:

PictureBox mainSprite = new PictureBox();
...
for(var i = 0; i < sprites.Length; i++)
{
    sprites[i] = mainSprite;

数组将有许多对同一对象的引用。您应该在循环的每次迭代上创建一个新的 PictureBox:

for(var i = 0; i < sprites.Length; i++)
{
    PictureBox mainSprite = new PictureBox();
    mainSprite.Size = new Size(16, 16);
    mainSprite.Image = img;
    sprites[i] = mainSprite;
    ...
}