winforms 标签与图像的左边-防止文字来的图片?

t3psigkw  于 2023-03-31  发布在  其他
关注(0)|答案(7)|浏览(134)

我想在C#编写的WinForm应用程序中报告操作的状态。为了使其更加用户友好,我想根据状态在左侧显示图标。

  • 过程中的GIF动画
  • “OK”或“Error”图标,具体取决于结果。

我想使用原生的WinForms Label控件,它可以很好地与动画GIF一起工作,并且看起来像它可以得到的标准。
然而,我的问题是,文字来是写在图片上。似乎没有任何属性设置一个边距的文本。我尝试了最明显的事情,这是前缀与空格,这工作,除非当文本换行到下一行,如下所示。

如果可能的话,我不想花太多时间编写/测试/调试派生控件……我可以放一个快速而肮脏的用户控件,在标签的左边有一个图片框,但感觉不是很干净。
有没有什么技巧可以快速优雅地解决这个问题,或者有人可以告诉我一个相对轻量级的支持这个的Label派生类?(我看了看CodeProject,但找不到太多)。
谢谢大家。

bttbmeg0

bttbmeg01#

一个简单的替代方法是使用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

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

t98cgbkg

t98cgbkg2#

最好的选择是使用一个图像和一个单独的标签的快速用户控件,只要添加一个公共字符串属性来设置标签的文本,就基本完成了。

tct7dpnv

tct7dpnv3#

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

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

iyzzxitl4#

UserControl的一个替代方案是使用两列一行的TableLayoutPanel,将图像控件放在一个单元格中,将文本控件放在另一个单元格中。

4ktjp1zp

4ktjp1zp5#

这是一个老问题,但也许有人会看这里就像我在这里...
您可以在图像和文本上使用对齐:

label.TextAlign = ContentAlignment.MiddleRight;
label.ImageAlign = ContentAlignment.MiddleLeft;
kyxcudwk

kyxcudwk6#

我想,我找到了更简单的解决办法:

Label.Width = Label.Image.Width + 5 + TextRenderer.MeasureText(text, Label.Font).Width

标签必须按如下方式设置(可在Designer上设置):

Label.AutoSize = False
Label.ImageAlign = ContentAlignment.MiddleLeft
Label.TextAlign = ContentAlignment.MiddleRight

结果:

cbwuti44

cbwuti447#

nameoftextlabel.hidden=1

应该可以

相关问题