我有一个显示文件名的标签..我必须将标签的AutoSize
设置为False
才能进行设计。
因此,当文件名文本比标签大小更长时......它会像图片一样被剪切。
label1.Size = new Size(200, 32);
label1.AutoSize = false;
当文字长于标签尺寸时,如何自动调整文字大小以适合标签尺寸?
答案 0 :(得分:29)
您可以使用下面的代码段。系统需要一些循环来根据文本大小计算标签的字体。
while(label1.Width < System.Windows.Forms.TextRenderer.MeasureText(label1.Text,
new Font(label1.Font.FontFamily, label1.Font.Size, label1.Font.Style)).Width)
{
label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size - 0.5f, label1.Font.Style);
}
答案 1 :(得分:8)
标签缩放
private void scaleFont(Label lab)
{
Image fakeImage = new Bitmap(1, 1); //As we cannot use CreateGraphics() in a class library, so the fake image is used to load the Graphics.
Graphics graphics = Graphics.FromImage(fakeImage);
SizeF extent = graphics.MeasureString(lab.Text, lab.Font);
float hRatio = lab.Height / extent.Height;
float wRatio = lab.Width / extent.Width;
float ratio = (hRatio < wRatio) ? hRatio : wRatio;
float newSize = lab.Font.Size * ratio;
lab.Font = new Font(lab.Font.FontFamily, newSize, lab.Font.Style);
}
答案 2 :(得分:5)
基于@brgerner提供的article,我将在这里提供替代实现,因为标记为答案的那个不如下面这样有效或完整:
public class FontWizard
{
public static Font FlexFont(Graphics g, float minFontSize, float maxFontSize, Size layoutSize, string s, Font f, out SizeF extent)
{
if (maxFontSize == minFontSize)
f = new Font(f.FontFamily, minFontSize, f.Style);
extent = g.MeasureString(s, f);
if (maxFontSize <= minFontSize)
return f;
float hRatio = layoutSize.Height / extent.Height;
float wRatio = layoutSize.Width / extent.Width;
float ratio = (hRatio < wRatio) ? hRatio : wRatio;
float newSize = f.Size * ratio;
if (newSize < minFontSize)
newSize = minFontSize;
else if (newSize > maxFontSize)
newSize = maxFontSize;
f = new Font(f.FontFamily, newSize, f.Style);
extent = g.MeasureString(s, f);
return f;
}
public static void OnPaint(object sender, PaintEventArgs e, string text)
{
var control = sender as Control;
if (control == null)
return;
control.Text = string.Empty; //delete old stuff
var rectangle = control.ClientRectangle;
using (Font f = new System.Drawing.Font("Microsoft Sans Serif", 20.25f, FontStyle.Bold))
{
SizeF size;
using (Font f2 = FontWizard.FlexFont(e.Graphics, 5, 50, rectangle.Size, text, f, out size))
{
PointF p = new PointF((rectangle.Width - size.Width) / 2, (rectangle.Height - size.Height) / 2);
e.Graphics.DrawString(text, f2, Brushes.Black, p);
}
}
}
}
和用法:
val label = new Label();
label.Paint += (sender, e) => FontWizard.OnPaint(sender, e, text);
答案 3 :(得分:0)
我使用以下加权缩放技巧来提供良好的拟合,即在拟合高度和拟合宽度之间进行加权折衷。它在VB .net中,但我认为你可以轻松地转换为C#。
Function shrinkFontToFit(f As Font, text As String, requiredsize As SizeF) As Font
Dim actualsize As SizeF = TextRenderer.MeasureText(text, f)
Return New Font(f.FontFamily, f.Size * (requiredsize.Width + requiredsize.Height ) _
/ (actualsize.Width + actualsize.Height), f.Style, GraphicsUnit.Pixel)
End Function
答案 4 :(得分:0)
在@ bnguyen82的启发下,我想到了一直有效的方法。
public static void ScaleLabel(Label label, float stepSize = 0.5f)
{
//decrease font size if text is wider or higher than label
while (lblTextSize() is Size s && s.Width > label.Width || s.Height > label.Height)
{
label.Font = new Font(label.Font.FontFamily, label.Font.Size - stepSize, label.Font.Style);
}
//increase font size if label width is bigger than text size
while (label.Width > lblTextSize().Width)
{
var font = new Font(label.Font.FontFamily, label.Font.Size + stepSize, label.Font.Style);
var nextSize = TextRenderer.MeasureText(label.Text, font);
//dont make text width or hight bigger than label
if (nextSize.Width > label.Width || nextSize.Height > label.Height)
break;
label.Font = font;
}
Size lblTextSize() => TextRenderer.MeasureText(label.Text,
new Font(label.Font.FontFamily, label.Font.Size, label.Font.Style));
}
PS:要使其正常工作,标签必须具有AutoSize = false
且必须为docked
或anchored
。
答案 5 :(得分:0)
这种方法对我有用
只需减少字体大小,直到达到所需的宽度。
while (label1.Width >150 )
{
label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size - 0.5f, label1.Font.Style);
}
答案 6 :(得分:0)
首先,每当文本更改时,您都需要一个事件:
lbl.TextChanged += new EventHandler(Label_TextChanged);
然后您将事件内的字体更改为适合:
private void Label_TextChanged(object sender, EventArgs e)
{
Label lbl = (Label)sender;
if (lbl.Image != null) return;
using (Graphics cg = lbl.CreateGraphics())
{
SizeF lblsize = new SizeF(lbl.Width, lbl.Height);
SizeF textsize = cg.MeasureString(lbl.Text, lbl.Font, lblsize);
while (textsize.Width > lblsize.Width - (lblsize.Width * 0.1))
{
lbl.Font = new Font(lbl.Font.Name, lbl.Font.Size - 1, lbl.Font.Style);
textsize = cg.MeasureString(lbl.Text, lbl.Font, lblsize);
if (lbl.Font.Size < 6) break;
}
}
}
这样,您可以使用较小的字体。 当涉及图像时,我会跳过。 我也停到5号。 我以-1的间隔缩小。 -0.5也可以。 我认为控制区域的10%是无法使用的“边界”-效果很好。 该技术将起作用,但是不要期望将大文本的结果转换为小标签。 如果没有图像,则可以使用控件代替标签,也可以将其应用于按钮和文本框。
答案 7 :(得分:-2)
private void setFontSize(Label label1)
{
if (label1.Text.Length > 200)
{
label1.Font = new Font(label1.Font.FontFamily, 24f, label1.Font.Style);
}
else if (label1.Text.Length > 100)
{
label1.Font= new Font(label1.Font.FontFamily, 36f, label1.Font.Style);
}else
label1.Font = new Font(label1.Font.FontFamily, 48f, label1.Font.Style);//My orginal font size is 48f.
}
您可以自己编辑。
private void button1_Click(object sender, EventArgs e)
{
Panel.Text = "Your Text";
setFontSize(Panel);
}
答案 8 :(得分:-2)
我认为最简单的方法是检查渲染大小,如果它大于实际标签大小,请减少标签的字体大小。
private void label3_Paint(object sender,PaintEventArgs e) {
Size sz = TextRenderer.MeasureText(label1.Text, label1.Font, label1.Size, TextFormatFlags.WordBreak);
if (sz.Width > label1.Size.Width || sz.Height > label1.Size.Height)
{
DecreaseFontSize(label1);
}
}
public void DecreaseFontSize(Label lbl) {
lbl.Font = new System.Drawing.Font(lbl.Font.Name, lbl.Font.Size - 1, lbl.Font.Style);
}