C# 是否有一种方法可以调整带有循环的窗体上每个控件的字体大小?
我有一个表单,有一堆标签、富文本框、文本框和按钮。我一直在尝试锚定和自动缩放(dpi/font),试图让我的UI在大范围的屏幕分辨率下看起来或多或少相同。到目前为止,我在使控件正确调整大小方面取得了一些进展,但现在我需要在控件更改后调整字体大小 我尝试了来自的解决方案(有一个小改动,忽略父容器,只使用标签本身),这对标签非常有效,但文本框没有绘制事件,因此我无法从通常在e中传递的信息中获得缩放比例。绘制事件的图形参数给出字符串的大小:C# 是否有一种方法可以调整带有循环的窗体上每个控件的字体大小?,c#,winforms,scaling,C#,Winforms,Scaling,我有一个表单,有一堆标签、富文本框、文本框和按钮。我一直在尝试锚定和自动缩放(dpi/font),试图让我的UI在大范围的屏幕分辨率下看起来或多或少相同。到目前为止,我在使控件正确调整大小方面取得了一些进展,但现在我需要在控件更改后调整字体大小 我尝试了来自的解决方案(有一个小改动,忽略父容器,只使用标签本身),这对标签非常有效,但文本框没有绘制事件,因此我无法从通常在e中传递的信息中获得缩放比例。绘制事件的图形参数给出字符串的大小: public static float NewFontSi
public static float NewFontSize(Graphics graphics, Size size, Font font, string str)
{
SizeF stringSize = graphics.MeasureString(str, font);
float wRatio = size.Width / stringSize.Width;
float hRatio = size.Height / stringSize.Height;
float ratio = Math.Min(hRatio, wRatio);
return font.Size * ratio;
}
private void lblTempDisp_Paint(object sender, PaintEventArgs e)
{
float fontSize = NewFontSize(e.Graphics, lblTempDisp.Bounds.Size, lblTempDisp.Font, lblTempDisp.Text);
Font f = new Font("Arial", fontSize, FontStyle.Bold);
lblTempDisp.Font = f;
}
主要问题:是否有类似的方法调整文本框的字体大小
第二个问题:在表单上循环使用一种类型的所有控件的正确方法是什么?我试过:
foreach (Label i in Controls)
{
if (i.GetType() == Label)//I get an error here that says
//"Label is a type, which is not valid in the given context"
{
i.Font = f;
}
}
我知道有一种方法可以检查控件是否是标签,但它似乎不是 关于第二个问题:
foreach(Control control in Controls)
{
if (control is Label)
{
((Label)control).Font = f;
}
}
另一种方式是:
foreach (Label label in Controls.OfType<Label>())
{
label.Font = f;
}
foreach(Controls.OfType()中的标签)
{
label.Font=f;
}
在比较类型时,请尝试使用is
运算符,而不是=
。foreach(控件中的标签i)无法工作,因为您尝试将非标签控件放置在标签i中。字体是环境属性,如果设置父控件的字体,则其所有子控件都将使用相同的字体。因此,我认为不需要循环将字体分配给所有控件,除非需要将字体应用于特定类型的所有子控件,在本例中,您可以查看。