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# и .NET Framework: что выбрать новичку
- Классы и свойства в C#: первый пример
- List, Dictionary и LINQ в C#
- Рубрика C#
Что почитать дальше по C#
Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:
- Как размножить одну картинку на несколько в C# Windows Forms
- Как создать форму в си шарп: первый Windows Forms пример
- Windows Forms App (.NET Framework): что это за шаблон в C#
- Как добавить форму в Visual Studio для C# Windows Forms