我希望能够Label
使其看起来像
[这里的一些文字] [ICON]
即。图标跟随文字,相当简单。
我不知道文本在设计时会是什么,所以我在AutoSize
控件上将Label
设置为true,但这意味着图像只是在文本的顶部绘制。如果我在右侧添加Padding
,它的行为并不像我想要的那样(一个CSS,在填充区域内绘制背景图像)。是否可以在C#Winforms中执行此操作?或者我将不得不测量文本然后自己更改控件宽度?
感谢。
编辑:为了清楚起见,我并没有提出两个控件,一个接一个。而是设置Label.Image
属性并将其显示在标签文本的一侧。显然,这不是自动标签的内置功能,看起来非常弱。
答案 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
,并相应地设置ImageAlign
和TextAlign
。
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
}
}