Ярлык с изображением слева - предотвращение перехода текста на изображение?

Я хочу сообщить о состоянии операции в приложении WinForm, написанном на С#. Чтобы сделать его более удобным для пользователя, я хочу показать значок слева в зависимости от состояния.

  • Анимированный GIF во время процесса
  • ОК или значок ошибки в зависимости от результата.

Я хотел использовать собственный элемент управления LabForms Label, который хорошо работает с анимированными GIF файлами и выглядит стандартно, как он может получить.

Однако моя проблема заключается в том, что текст нарисован над изображением. Кажется, что нет никакого свойства для установки поля для текста. Я пробовал наиболее очевидную вещь, которая предназначена для префикса его пробелами, которая работает, за исключением случаев, когда текст переносится на следующую строку, как показано ниже.

enter image description here

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

Есть ли какой-либо трюк, чтобы обойти это быстро и элегантно, или кто-то может указать мне на класс, основанный на методе, поддерживающий это относительно легкое? (Я смотрел CodeProject, но не мог найти много).

Спасибо.

Ответ 1

Быстрый и грязный пользовательский контроль с изображением и отдельной меткой - ваш лучший вариант. Просто добавьте свойство публичной строки, чтобы установить текст ярлыка, и вы в значительной степени сделали.

Ответ 2

Простой альтернативой является использование Button вместо Label, как показано ниже:

Используя следующие свойства, вы можете стилизовать Button, чтобы выглядеть так же, как Label, в то же время имея возможность сохранить изображение и текст, выровненные рядом друг с другом:

FlatAppearance ↴
  BorderSize         = 0
  MouseDownBackColor = Control
  MouseOverBackColor = Control
FlatStyle            = Flat
Image                = [Your image]
ImageAlign           = MiddleLeft
Text                 = [Your text]
TextAlign            = MiddleLeft
TextImageRelation    = ImageBeforeText

Простой способ добиться желаемого эффекта; без контроля пользователя!

Ответ 3

Здесь другое решение, которое я нахожу менее взломанным, чем подход "стиль кнопки". Он также позволяет установить расстояние (расстояние) между изображением и текстом.

class ImageLabel : Label
{
    public ImageLabel()
    {
        ImageAlign = ContentAlignment.MiddleLeft;
    }

    private Image _image;
    public new Image Image
    {
        get { return _image; }

        set
        {
            const int spacing = 4;

            if (_image != null)
                Padding = new Padding(Padding.Left - spacing - _image.Width, Padding.Top, Padding.Right, Padding.Bottom);

            if (value != null)
                Padding = new Padding(Padding.Left + spacing + value.Width, Padding.Top, Padding.Right, Padding.Bottom);

            _image = value;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (Image != null)
        {
            Rectangle r = CalcImageRenderBounds(Image, ClientRectangle, ImageAlign);
            e.Graphics.DrawImage(Image, r);
        }

        base.OnPaint(e); // Paint text
    }
}

Ответ 4

Один из альтернатив UserControl - использовать TableLayoutPanel с двумя столбцами и одной строкой, помещая элемент управления изображением в одну ячейку и текстовое управление в другое.

Ответ 5

Его старый вопрос, но, возможно, кто-то будет выглядеть здесь, как будто я здесь...

Вы можете использовать выравнивание по изображению и по тексту:

label.TextAlign = ContentAlignment.MiddleRight;
label.ImageAlign = ContentAlignment.MiddleLeft;

Ответ 6

nameoftextlabel.hidden=1

Это должно сработать.