C# 是否可以在填充区域内显示Label.Image?

C# 是否可以在填充区域内显示Label.Image?,c#,winforms,C#,Winforms,我希望能够有一个标签,这样它看起来像 [此处有一些文字][图标] i、 e.图标跟随文本,相当简单 我不知道在设计时文本是什么,所以我在Label控件上将AutoSize设置为true,但这意味着图像只是在文本顶部绘制。如果我在右侧添加填充,它的行为将不符合我的要求(一个la CSS,背景图像绘制在填充区域内)。可以在C#Winforms中执行此操作吗?还是我必须测量文本,然后自己更改控件宽度 谢谢 编辑:我只是想说清楚,我并没有提出两个控件,一个接一个。而是设置Label.Image属性,并使

我希望能够有一个
标签
,这样它看起来像

[此处有一些文字][图标]

i、 e.图标跟随文本,相当简单

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

谢谢


编辑:我只是想说清楚,我并没有提出两个控件,一个接一个。而是设置
Label.Image
属性,并使其显示在标签文本的一侧。显然,这并不是自动调整标签大小的内置功能,它似乎很弱。

您能使用一个来实现这一点吗?将自动调整大小的标签放在排序中的图标之前,它应该根据需要展开。

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

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

如果标签放置在适当的容器中,则可以使用停靠属性。 将标签和图标都设置为向左停靠,并使标签自动调整大小

请注意,无论如何,您需要使用一个附加控件
FlowLayoutPanel
似乎是更好的解决方案。 您可以绘制自己的自定义图标标签控件,但它似乎比
FlowLayoutPanel
更过分


编辑:或仅手动定位控件。Icon.Left=Label.Left+Label.Width+padding。

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

虽然Hans Passant给出的方法有效,但右对齐使不同字符串的文本位置不一致

我用下面的方法得到了更好的结果。如果希望图像位于文本的右侧,请修改
Padding.right
而不是
Padding.Left
,并相应地设置
ImageAlign
textalalign

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

我真的不想添加两个控件-我想使用标签的图像属性。FlowLayoutPanel对此似乎有些过分。@QmunkE
Label.ImageAlign
属性如何?它不考虑文本。如果我将文本对齐设置为middleft,将图像对齐设置为middleft,则图像将绘制在文本最后一个字符的上方/后面。如果我在右侧添加填充,填充将显示在图像的右侧,正如我在问题中指定的那样。