Пропорциональное увеличение контейнера C#

Доброго времени суток!

Есть пикчербоксы, которым заданы начальные размеры, а также привязка к сторонам формы для резинового макета. Вопрос: как при расширении формы сохранить пропорцию сторон пикчербоксов?


Ответы (1 шт):

Автор решения: t3f

Если важны пропорции изображения, а не самого PictureBox, то можно просто установить:

pictureBox.SizeMode = PictureBoxSizeMode.Zoom;

после этого изображение всегда будет сохранять свои пропорции, независимо от пропорций PictureBox.

Можно также сделать привязку PictureBox только к одной из сторон формы, а размер по второй оси вычислять в событии Resize. Для примера, вычисление высоты для соотношения сторон 16:9 (ширина привязана к ширине формы):

private void pictureBox_Resize(object sender, EventArgs e) {
    pictureBox.Height = (int)((float)pictureBox.Width / 16 * 9);
}

приведение к float здесь используется потому что иначе (если делить/умножать int) возникает заметная погрешность. Но такой вариант подойдёт не всегда.

Если описанные выше варианты не подошли, то наверное придётся обрабатывать Resize формы, определять размеры доступной области и по ним самостоятельно вычислять нужные размеры PictureBox. Например так (опять же для соотношения сторон 16:9, входные параметры - максимальная доступная ширина и максимальная доступная высота):

Size AdjustSize(int max_width, int max_height)
{
    float width = max_width; // берём максимальную доступную ширину
    float height = (width / 16) * 9; // вычисляем по ней высоту
    if (height >= max_height) { // если полученная высота превышает доступную
        height = max_height; // пересчитываем заново
        width = (height / 9) * 16; // но теперь уже исходя из доступной высоты
    }
    return new Size((int)width, (int)height);
}
→ Ссылка