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,则图像将绘制在文本最后一个字符的上方/后面。如果我在右侧添加填充,填充将显示在图像的右侧,正如我在问题中指定的那样。