Label.Image是否可以出现在填充区域内?

时间:2010-10-11 12:40:12

标签: c# winforms

我希望能够Label使其看起来像

[这里的一些文字] [ICON]

即。图标跟随文字,相当简单。

我不知道文本在设计时会是什么,所以我在AutoSize控件上将Label设置为true,但这意味着图像只是在文本的顶部绘制。如果我在右侧添加Padding,它的行为并不像我想要的那样(一个CSS,在填充区域内绘制背景图像)。是否可以在C#Winforms中执行此操作?或者我将不得不测量文本然后自己更改控件宽度?

感谢。

编辑:为了清楚起见,我并没有提出两个控件,一个接一个。而是设置Label.Image属性并将其显示在标签文本的一侧。显然,这不是自动标签的内置功能,看起来非常弱。

5 个答案:

答案 0 :(得分:6)

您可以通过从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;
    }
}

答案 1 :(得分:4)

我认为您必须将ImageAlign设置为right并将TextAlign设置为left,然后手动计算宽度,

int gap=10;
myLabel.AutoSize=true;
int autoWidth=myLable.Width;
myLabel.AutoSize=false;
myLabel.Width=autoWidth+gap+myLabel.Image.Width;

答案 2 :(得分:1)

您可以使用FlowLayoutPanel来实现这一目标吗?将自动标签放在订单中的图标前面,并根据需要展开。

答案 3 :(得分:0)

如果您的标签放在合适的容器内,您可以使用对接属性。 将标签和图标设置为左侧并使标签自动调整。

P.S。无论如何,你需要使用额外的控件。 FlowLayoutPanel似乎更好的解决方案恕我直言。 你可以绘制自己的自定义图标标签控件,但它似乎比FlowLayoutPanel更难。

编辑:或者只是手动定位控件。 Icon.Left = Label.left + Label.Width + padding。

答案 4 :(得分:0)

虽然Hans Passant 给出的方法,但右对齐会使文本放置对于不同的字符串不一致。

通过以下方法我获得了更好的结果。如果您希望图片位于文字的右侧,请修改Padding.Right而不是Padding.Left,并相应地设置ImageAlignTextAlign

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
    }
}