You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm中如何实现Label字体自适应UserControl控件尺寸

方案1:固定字号,控件自动适配字体尺寸

这种逻辑适合优先保证字体大小符合需求,控件尺寸随字体自动调整。
核心实现逻辑是:设置字体后,测量指定文本格式下的内容所需宽高,加上边距后赋值给用户控件的Size属性。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Extract
{
    public partial class TimeCounter : UserControl
    {
        private Timer _timer;
        private Label _label;
        private int _elapsedSeconds;
        // 可自定义控件内边距,避免文字贴边
        private const int Padding = 5;

        public TimeCounter()
        {
            InitializeComponent();

            _timer = new Timer
            {
                Interval = 1000,
                Enabled = true
            };
            _timer.Tick += (sender, args) =>
            {
                _elapsedSeconds++;
                TimeSpan time = TimeSpan.FromSeconds(_elapsedSeconds);
                _label.Text = time.ToString(@"hh\:mm\:ss");
            };

            _label = new Label
            {
                Dock = DockStyle.Fill,
                TextAlign = ContentAlignment.MiddleCenter,
                // 直接修改此处字号即可,控件会自动适配大小
                Font = new Font("Arial", 24, FontStyle.Bold)
            };
            Controls.Add(_label);

            // 初始化时适配一次尺寸
            AdjustControlSizeToFitFont();
        }

        private void AdjustControlSizeToFitFont()
        {
            using (Graphics g = CreateGraphics())
            {
                // 测量hh:mm:ss格式文本的最大可能宽高
                SizeF textSize = g.MeasureString("00:00:00", _label.Font);
                // 加上内边距设置控件大小
                Size = new Size((int)Math.Ceiling(textSize.Width) + Padding * 2, 
                    (int)Math.Ceiling(textSize.Height) + Padding * 2);
            }
        }

        private void TimeCounter_Load(object sender, EventArgs e)
        {
        }
    }
}

修改字号后重新编译,控件拖拽到Form上会直接显示正确尺寸,无需反复调整测试。


方案2:固定控件尺寸,字号自动适配

这种逻辑适合优先保证控件占位大小固定,字体自动缩放适配控件内部空间。
核心实现逻辑是:监听控件的Resize事件,动态计算当前控件尺寸下可容纳的最大字号,更新Label字体。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Extract
{
    public partial class TimeCounter : UserControl
    {
        private Timer _timer;
        private Label _label;
        private int _elapsedSeconds;
        // 可自定义控件内边距
        private const int Padding = 5;

        public TimeCounter()
        {
            InitializeComponent();

            _timer = new Timer
            {
                Interval = 1000,
                Enabled = true
            };
            _timer.Tick += (sender, args) =>
            {
                _elapsedSeconds++;
                TimeSpan time = TimeSpan.FromSeconds(_elapsedSeconds);
                _label.Text = time.ToString(@"hh\:mm\:ss");
            };

            _label = new Label
            {
                Dock = DockStyle.Fill,
                TextAlign = ContentAlignment.MiddleCenter,
                Font = new Font("Arial", 10, FontStyle.Bold)
            };
            Controls.Add(_label);

            // 绑定Resize事件,控件大小变化时自动适配字号
            Resize += (s, e) => AdjustFontSizeToFitControl();
            // 初始化时适配一次
            AdjustFontSizeToFitControl();
        }

        private void AdjustFontSizeToFitControl()
        {
            if (_label == null) return;

            int availableWidth = ClientSize.Width - Padding * 2;
            int availableHeight = ClientSize.Height - Padding * 2;
            if (availableWidth <= 0 || availableHeight <= 0) return;

            float bestFontSize = 1f;
            // 递增测试找到当前尺寸下可容纳的最大字号
            for (float fontSize = 1f; fontSize < 100f; fontSize += 0.5f)
            {
                using (Font testFont = new Font(_label.Font.FontFamily, fontSize, _label.Font.Style))
                using (Graphics g = CreateGraphics())
                {
                    SizeF textSize = g.MeasureString("00:00:00", testFont);
                    if (textSize.Width <= availableWidth && textSize.Height <= availableHeight)
                    {
                        bestFontSize = fontSize;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            // 更新最终适配字体
            _label.Font = new Font(_label.Font.FontFamily, bestFontSize, _label.Font.Style);
        }

        private void TimeCounter_Load(object sender, EventArgs e)
        {
        }
    }
}

编译后把控件拖拽到Form上,直接在设计视图拖拽调整控件大小,字体就会自动缩放适配,无需修改代码反复测试。

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:54:03