C#:一个在运行时根据控件大小自动调整字体的函数



花费大量时间搜索此函数后:

我想如果有人能给我最好的方法,那就太好了。是否有一个功能可以根据任何窗口窗体控件(标签/按钮)的大小动态调整字体大小?

这是我在网上研究后得到的,不幸的是,当控件重新调整大小时,这些代码在运行时会出现很多异常。

public void textAdjustment()
    {
        try
        {
            while (this.label.Width < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text,
               new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width)
            {
                this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 1.0f, this.label.Font.Style);
            }
            if (this.label.Width > System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width)
            {
                this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size + 0.1f, this.tableLabel.Font.Style);
            }
            if (this.label.Height < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Height)
            {
                this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 0.6f, this.label.Font.Style);
            }
        }
        catch (Exception e)
        {
            this.label.Font = Control.DefaultFont;
        }
    }

我不认为我解决这个问题的方法是正确的,有人知道一种即使在运行时增加和减少控件大小也能调整字体大小的方法吗?我个人认为,这篇帖子将是一个非常好的帖子,供其他人参考。

这是一种非常麻烦的代码,字体的正确大小与控件的大小没有很好的相关性。用户界面在任何窗口大小下都应该可读且一致,这也不是一件常见的事情。除此之外,你还不清楚你看到的是什么样的例外。明显的错误是忘记关闭标签的AutoSize属性,并且没有使标签足够高。有些代码可以玩,请注意它只适用于Label。在粘贴此代码之前在表单上放置一个:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        label1.AutoSize = false;
        label1.Size = new Size(100, 60);
        label1.Text = "Autosize this";
        label1.Anchor = AnchorStyles.Left | AnchorStyles.Right;
        label1.Resize += new EventHandler(label1_Resize);
    }
    void label1_Resize(object sender, EventArgs e) {
        using (var gr = label1.CreateGraphics()) {
            Font font = label1.Font;
            for (int size = (int)(label1.Height * 72 / gr.DpiY); size >= 8; --size) {
                font = new Font(label1.Font.FontFamily, size, label1.Font.Style);
                if (TextRenderer.MeasureText(label1.Text, font).Width <= label1.ClientSize.Width) break;
            }
            label1.Font = font;
        }
    }
    protected override void OnLoad(EventArgs e) {
        label1_Resize(this, EventArgs.Empty);
        base.OnLoad(e);
    }
}

它需要改进,MeasureText()方法应该使用Label控件使用的TextFormatFlags。但这已经足够好了。

最新更新