Kha*_*uez 14 c# label winforms
我想报告用C#编写的WinForm应用程序中的操作状态.为了使其更加用户友好,我想在左侧显示一个图标,具体取决于状态.
我想使用原生的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)
一种达到预期效果的简单方法; 没有用户控制!
这是一个不同的解决方案,我发现它比“样式按钮”方法更简单。它还允许您设置图像和文本之间的距离(间距)。
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)