标签左侧有一个图像 - 阻止文字覆盖图片?

Kha*_*uez 14 c# label winforms

我想报告用C#编写的WinForm应用程序中的操作状态.为了使其更加用户友好,我想在左侧显示一个图标,具体取决于状态.

  • 在此过程中动画GIF
  • 确定或错误图标取决于结果.

我想使用原生的WinForms Label控件,该控件适用于动画GIF并且看起来尽可能标准.

然而,我的问题是文字出现在图片上.似乎没有任何属性可以为文本设置边距.我尝试了最显而易见的事情,即在它前面加上空格,这有效,除非文本换行到下一行,如下所示.

在此输入图像描述

如果可能的话,我宁愿不花太多时间编写/测试/调试派生控件......我可以放一个快速而脏的用户控件,在标签的左边有一个图片框,但是感觉不是很好清洁.

是否有任何技巧可以快速优雅地解决这个问题,或者有人可以指向我支持相对轻量级的Label派生类?(我看过CodeProject但找不到多少).

谢谢.

Dan*_*ett 25

一个简单的替代方法是使用a Button而不是a Label,如下所示:

通过使用以下属性,您可以将样式设置Button为看起来像a Label,同时还可以选择将图像和文本保持在彼此旁边:

FlatAppearance ?
  BorderSize         = 0
  MouseDownBackColor = Control
  MouseOverBackColor = Control
FlatStyle            = Flat
Image                = [Your image]
ImageAlign           = MiddleLeft
Text                 = [Your text]
TextAlign            = MiddleLeft
TextImageRelation    = ImageBeforeText
Run Code Online (Sandbox Code Playgroud)

一种达到预期效果的简单方法; 没有用户控制!


xxb*_*bcc 8

具有图像和单独标签的快速和脏的用户控件是您的最佳选择.只需添加一个公共字符串属性来设置标签的文本就可以了.


Chr*_*ian 5

这是一个不同的解决方案,我发现它比“样式按钮”方法更简单。它还允许您设置图像和文本之间的距离(间距)。

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
    }
}
Run Code Online (Sandbox Code Playgroud)