Создание многочисленных PictureBox по коду - виден только один - PullRequest
0 голосов
/ 07 июля 2011

Я пытаюсь нарисовать много экземпляров изображения, используя следующий код:

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]);

У меня была эта проблема много раз, особенно когда я пытался создать много групповых ящиков похожим образом. За те часы, которые я искал в Интернете, пытаясь найти решение, ничто так и не исправило его.

1 Ответ

6 голосов
/ 07 июля 2011

Вы на самом деле создаете только один экземпляр PictureBox:

PictureBox mainSprite = new PictureBox();

...

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

Ваш массив будет иметь много ссылок на один и тот же объект. Вы должны создать new 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;
    ...
}
...