C#
Как размножить одну картинку на несколько в C# Windows Forms
В C# Windows Forms одну картинку можно вывести несколько раз через несколько PictureBox. Картинка хранится в объекте Image, а каждый PictureBox показывает ее в своем месте. Обычно делают цикл: создают новый PictureBox, задают Image, размер, координаты и добавляют на форму через Controls.Add
Базовый пример
Пусть на форме есть pictureBoxSource, в котором уже выбрана картинка. Создадим пять копий:
for (int i = 0; i < 5; i++)
{
PictureBox box = new PictureBox
{
Image = pictureBoxSource.Image,
Width = 80,
Height = 80,
SizeMode = PictureBoxSizeMode.Zoom,
Left = 20 + i * 90,
Top = 100,
Tag = "generated"
};
Controls.Add(box);
}
Каждый PictureBox отдельный, но изображение у них одно и то же
Почему Image можно использовать несколько раз
Если вы просто показываете картинку, один объект Image можно назначить нескольким контролам. Это нормально: контролы не становятся одним и тем же объектом. Они только ссылаются на одно изображение. Но если вы собираетесь изменять картинку, рисовать на ней или освобождать ресурсы вручную, тогда нужно внимательнее управлять копиями
Для учебного сценария с одинаковыми значками, карточками или плитками достаточно одного Image и нескольких PictureBox
Перед созданием копий проверьте исходную картинку:
if (pictureBoxSource.Image == null)
{
MessageBox.Show("Сначала выберите картинку");
return;
}
Без этой проверки код создаст пустые PictureBox, и будет казаться, что цикл не работает. На самом деле элементов на форме может быть много, просто им нечего показывать
Сетка картинок
Чтобы разместить картинки в несколько рядов:
int columns = 4;
int size = 70;
int gap = 12;
for (int i = 0; i < 12; i++)
{
int row = i / columns;
int column = i % columns;
PictureBox box = new PictureBox
{
Image = pictureBoxSource.Image,
Width = size,
Height = size,
SizeMode = PictureBoxSizeMode.Zoom,
Left = 20 + column * (size + gap),
Top = 20 + row * (size + gap),
Tag = "generated"
};
Controls.Add(box);
}
Деление на строку и столбец помогает сделать галерею, игровое поле или набор товаров
Если картинка из ресурсов
Можно брать изображение из ресурсов проекта:
Image icon = Properties.Resources.ProductIcon;
А дальше назначать icon каждому PictureBox. Такой способ удобен, если картинка должна быть внутри приложения, а не лежать отдельным файлом рядом с .exe
Как очистить созданные картинки
Для удаления динамических элементов удобно использовать Tag:
foreach (Control control in Controls.Cast<Control>().ToList())
{
if (control is PictureBox && control.Tag?.ToString() == "generated")
{
Controls.Remove(control);
control.Dispose();
}
}
Так удаляются только созданные программно картинки, а исходный pictureBoxSource остается
Частые ошибки
Первая ошибка — написать PictureBox copy = pictureBoxSource и ждать новую картинку. Это только новая ссылка на тот же контрол. Вторая — забыть Controls.Add. Третья — не задать размер или SizeMode. Четвертая — создавать сотни контролов, хотя для сложной графики лучше рисовать на Panel или использовать игровой подход
Мини-задача: сделайте кнопку «Показать 12 картинок» и кнопку «Очистить». Первая строит сетку 4 на 3, вторая удаляет только элементы с Tag = "generated"
Что почитать дальше по C#
- C# и .NET Framework: что выбрать новичку
- Классы и свойства в C#: первый пример
- List, Dictionary и LINQ в C#
- Рубрика C#
Что почитать дальше по C#
Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:
- Как размножить PictureBox в C# Windows Forms
- Как создать форму в си шарп: первый Windows Forms пример
- Windows Forms App (.NET Framework): что это за шаблон в C#
- Как добавить форму в Visual Studio для C# Windows Forms