Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种方法可以调整带有循环的窗体上每个控件的字体大小?_C#_Winforms_Scaling - Fatal编程技术网

C# 是否有一种方法可以调整带有循环的窗体上每个控件的字体大小?

C# 是否有一种方法可以调整带有循环的窗体上每个控件的字体大小?,c#,winforms,scaling,C#,Winforms,Scaling,我有一个表单,有一堆标签、富文本框、文本框和按钮。我一直在尝试锚定和自动缩放(dpi/font),试图让我的UI在大范围的屏幕分辨率下看起来或多或少相同。到目前为止,我在使控件正确调整大小方面取得了一些进展,但现在我需要在控件更改后调整字体大小 我尝试了来自的解决方案(有一个小改动,忽略父容器,只使用标签本身),这对标签非常有效,但文本框没有绘制事件,因此我无法从通常在e中传递的信息中获得缩放比例。绘制事件的图形参数给出字符串的大小: public static float NewFontSi

我有一个表单,有一堆标签、富文本框、文本框和按钮。我一直在尝试锚定和自动缩放(dpi/font),试图让我的UI在大范围的屏幕分辨率下看起来或多或少相同。到目前为止,我在使控件正确调整大小方面取得了一些进展,但现在我需要在控件更改后调整字体大小

我尝试了来自的解决方案(有一个小改动,忽略父容器,只使用标签本身),这对标签非常有效,但文本框没有绘制事件,因此我无法从通常在e中传递的信息中获得缩放比例。绘制事件的图形参数给出字符串的大小:

 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中。字体是环境属性,如果设置父控件的字体,则其所有子控件都将使用相同的字体。因此,我认为不需要循环将字体分配给所有控件,除非需要将字体应用于特定类型的所有子控件,在本例中,您可以查看。