Как использовать DataGridViewImageColumn для отображения изображений с использованием масштабирования, а также с сохранением соотношения сторон? - PullRequest
0 голосов
/ 13 февраля 2019

Мой код

Построение столбца

IconColumn = new DataGridViewImageColumn()
{
    Name = "Icon",
    HeaderText = "Icon",
    SortMode = DataGridViewColumnSortMode.NotSortable,
    Width = 50,
    ImageLayout = DataGridViewImageCellLayout.Stretch,
    Resizable = DataGridViewTriState.False
};
IconColumn.DefaultCellStyle.NullValue = null;
IconColumn.CellTemplate = new ClockDataGridViewIconCell();

Настройка иконки

float maxHeight = 200;
float maxWidth = 200;

var r = new Rectangle(0,
    0,
    (int)Math.Round(maxWidth),
    (int)Math.Round(maxHeight)
);
MyClockData.Icon = Utils.ResizeToFitBoundingBox(
    new Bitmap(fd.FileName),
    r);

Метод ResizeToFitBoundingBox

internal static Bitmap ResizeToFitBoundingBox(Image image, in Rectangle box)
{
    float maxHeight = box.Width;
    float maxWidth = box.Height;

    float x = Math.Min(maxWidth / image.Width,
        maxHeight / image.Height);

    float newW = (float)image.Width * x;
    float newH = (float)image.Height * x;

    var bmp = new Bitmap((int)Math.Round(maxWidth),
        (int)Math.Round(maxHeight));
    bmp.MakeTransparent();
    using (Graphics gr = Graphics.FromImage(bmp))
    {
        gr.DrawImage(image, (bmp.Width - newW) / 2,
            (bmp.Height - newH) / 2, newW, newH);
    }

    return bmp;
}

Примерicon

full-sized-icon

Я испробовал все 4 возможных значения для DataGridViewImageColumn.ImageLayout, и ячейка выглядит одинаково:

  1. Нормальный

normal

Не установлено

not-set

Растянуть

stretch

Увеличение

zoom

Ни один из них не работает для того, что я хочу.Официальная документация здесь .Мне бы хотелось, чтобы поведение было таким же, как у Forms.ImageLayout.Zoom .

Примечание: Я использую .NET Framework v4.6.1.

1 Ответ

0 голосов
/ 13 февраля 2019

Я решил проблему, добавив следующую строку:

IconColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;

после каждого оператора, который добавляет или обновляет значок в DataGridView.

Кажется, что для этого свойства задано то же значениекак и раньше перерисовывает значки в столбце в соответствии со значением свойства.

...