C#

Как размножить PictureBox в C# Windows Forms

В Windows Forms один PictureBox обычно не «размножают» как готовый объект. Правильнее создать несколько новых PictureBox в цикле, задать им одинаковое изображение, размер, SizeMode, координаты и добавить на форму через Controls.Add. Так каждый элемент будет отдельным контролом, но визуально они могут выглядеть одинаково

Базовый пример

Допустим, на форме уже есть pictureBox1 с выбранным изображением. Создадим несколько копий рядом:

for (int i = 0; i < 5; i++)
{
    PictureBox box = new PictureBox();

    box.Image = pictureBox1.Image;
    box.Width = pictureBox1.Width;
    box.Height = pictureBox1.Height;
    box.SizeMode = pictureBox1.SizeMode;
    box.Left = 20 + i * 90;
    box.Top = 80;

    Controls.Add(box);
}

Код создает пять новых PictureBox. Они используют то же изображение, что и исходный элемент, но находятся в разных координатах

Перед запуском убедитесь, что у исходного pictureBox1 действительно есть изображение. Если Image равен null, новые элементы появятся, но будут пустыми. Для отладки можно временно задать им BackColor, чтобы видеть границы контролов и понимать, что проблема не в координатах

Почему нельзя просто присвоить PictureBox

Если написать так:

PictureBox copy = pictureBox1;

вы не создадите новый элемент. copy будет ссылкой на тот же самый PictureBox. Измените copy.Left — изменится исходный элемент. Поэтому нужен new PictureBox()

Создать сетку изображений

Можно разложить картинки в несколько строк и столбцов:

int columns = 4;
int size = 64;
int gap = 10;

for (int i = 0; i < 12; i++)
{
    int row = i / columns;
    int column = i % columns;

    PictureBox box = new PictureBox
    {
        Image = pictureBox1.Image,
        Width = size,
        Height = size,
        SizeMode = PictureBoxSizeMode.Zoom,
        Left = 20 + column * (size + gap),
        Top = 20 + row * (size + gap)
    };

    Controls.Add(box);
}

i / columns считает строку, i % columns — столбец. Это полезный прием для галереи, игрового поля или набора карточек

Если нужно разное изображение

Можно хранить изображения в массиве:

Image[] images = { image1, image2, image3 };

for (int i = 0; i < images.Length; i++)
{
    PictureBox box = new PictureBox
    {
        Image = images[i],
        Width = 80,
        Height = 80,
        SizeMode = PictureBoxSizeMode.Zoom,
        Left = 20 + i * 90,
        Top = 20
    };

    Controls.Add(box);
}

Так каждый PictureBox получает свое изображение

Если изображения загружаются из файлов, не открывайте один и тот же файл в цикле без необходимости. Обычно картинки заранее читают в массив или список, а потом назначают контролам. Так код проще проверять, и форма не делает лишнюю работу при каждом клике

Как удалить созданные PictureBox

Если вы создаете элементы динамически, удобно добавить им Tag:

box.Tag = "generated";

Потом можно найти и удалить:

foreach (Control control in Controls.Cast<Control>().ToList())
{
    if (control is PictureBox && control.Tag?.ToString() == "generated")
    {
        Controls.Remove(control);
        control.Dispose();
    }
}

Dispose освобождает ресурсы контрола

Частые ошибки

Первая ошибка — присвоить PictureBox copy = pictureBox1 и ждать копию. Вторая — создать новый PictureBox, но забыть Controls.Add. Третья — не задать размеры, из-за чего картинка не видна. Четвертая — создавать сотни контролов без необходимости: для сложной графики лучше использовать рисование или игровой движок

Мини-задача: создайте кнопку «Добавить картинки». При клике добавляйте 10 PictureBox в сетку 5 на 2. Затем добавьте кнопку «Очистить», которая удаляет только созданные элементы

Что почитать дальше по C#

Что почитать дальше по C#

Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x