Ярлык с изображением слева - предотвращение попадания текста на картинку? - PullRequest
14 голосов
/ 29 января 2012

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

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

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

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

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

Спасибо.

Ответы [ 6 ]

25 голосов
/ 04 июля 2013

Простая альтернатива - использовать 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

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

8 голосов
/ 29 января 2012

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

3 голосов
/ 22 сентября 2016

Вот другое решение, которое я считаю менее хакерским, чем подход «стилизованная кнопка». Это также позволяет вам установить расстояние (интервал) между изображением и текстом.

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
    }
}
0 голосов
/ 29 июля 2015

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

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

label.TextAlign = ContentAlignment.MiddleRight;
label.ImageAlign = ContentAlignment.MiddleLeft;
0 голосов
/ 28 января 2015

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

0 голосов
/ 29 января 2012
nameoftextlabel.hidden=1

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

...