Возможно ли, чтобы Label.Image появлялся внутри области заполнения? - PullRequest
4 голосов
/ 11 октября 2010

Я хотел бы иметь возможность иметь Label такой, чтобы она выглядела как

[Здесь немного текста] [ICON]

т.е. значок следует за текстом, довольно просто.

Я не знаю, какой будет текст во время разработки, поэтому у меня AutoSize установлен в true на элементе управления Label, но это означает, что изображение просто рисуется сверхутекста.Если я добавлю Padding в правую часть, он не будет работать так, как я хочу (в стиле CSS, где фоновые изображения рисуются внутри области отступов).Возможно ли это сделать в C # Winforms?Или мне придется измерить текст и затем изменить ширину элемента управления самостоятельно?

Спасибо.

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, я не предлагал два элемента управления, один послеДругой.Скорее, установите свойство Label.Image, чтобы оно отображалось с одной стороны от текста метки.По-видимому, это просто не встроенная функциональность для автоматически изменяемых этикеток, которая кажется довольно слабой.

Ответы [ 5 ]

6 голосов
/ 11 октября 2010

Вы можете сделать это, получив собственный элемент управления из Label и переопределив метод GetPreferredSize ().Добавьте новый класс в ваш проект и вставьте код, показанный ниже.Компиляция.Перетащите новый элемент управления из верхней части панели инструментов на форму.

using System;
using System.Drawing;
using System.Windows.Forms;

class MyLabel : Label {
    public MyLabel() {
        this.ImageAlign = ContentAlignment.MiddleLeft;
        this.TextAlign = ContentAlignment.MiddleRight;
    }
    public new Image Image {
        get { return base.Image; }
        set {
            base.Image = value;
            if (this.AutoSize) {  // Force size calculation
                this.AutoSize = false;
                this.AutoSize = true;
            }
        }
    }
    public override Size GetPreferredSize(Size proposedSize) {
        var size = base.GetPreferredSize(proposedSize);
        if (this.Image != null) size = new Size(size.Width + 3 + Image.Width, size.Height);
        return size;
    }
}
4 голосов
/ 11 октября 2010

Я думаю, вы должны установить ImageAlign вправо и TextAlign влево, а затем рассчитать ширину вручную,

int gap=10;
myLabel.AutoSize=true;
int autoWidth=myLable.Width;
myLabel.AutoSize=false;
myLabel.Width=autoWidth+gap+myLabel.Image.Width;
1 голос
/ 11 октября 2010

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

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

Хотя метод, данный Хансом Пассантом , работает , выравнивание по правому краю делает размещение текста несовместимым для разных строк.

Я получил лучшие результаты при следующем подходе.Если вы хотите, чтобы изображение находилось справа от текста, измените Padding.Right вместо Padding.Left и установите ImageAlign и TextAlign соответственно.

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 голосов
/ 11 октября 2010

Если ваша этикетка находится внутри соответствующего контейнера, вы можете просто использовать свойство закрепления. Установите ярлык и значок, закрепленный слева, и сделайте размер ярлыка автоматически.

P.S. В любом случае вам нужно использовать дополнительный контроль. FlowLayoutPanel кажется лучшим решением ИМХО. И вы можете нарисовать свой собственный значок-ярлык-элемент управления, но он кажется более излишним, чем FlowLayoutPanel.

РЕДАКТИРОВАТЬ: Или просто поместите ваши элементы управления вручную. Icon.Left = Label.left + Label.Width + padding.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...