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

求TextBox内容溢出自动缩字号方案(默认24,拒TextBlock,含XAML/C#)

WPF TextBox 自动缩放字号实现方案

针对你需要的TextBox文本超出时自动缩小字号、默认字号24的需求,这里提供WPF环境下的XAML+C#实现方案,完全避开TextBlock相关逻辑:

实现思路

核心逻辑是监听TextBox的文本变化和自身尺寸变化,实时计算当前文本在控件内的显示宽度,当超出可用宽度时逐步缩小字号直到文本能容纳,同时保留默认24号字的初始状态。

代码实现

1. XAML 部分

先定义TextBox的基础布局,绑定初始字号并添加事件监听:

<Window x:Class="TextBoxAutoResize.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TextBox Auto Resize" Height="300" Width="400">
    <Grid>
        <TextBox x:Name="autoResizeTextBox"
                 FontSize="24"
                 TextChanged="AutoResizeTextBox_TextChanged"
                 SizeChanged="AutoResizeTextBox_SizeChanged"
                 HorizontalContentAlignment="Left"
                 VerticalContentAlignment="Center"
                 Margin="20"/>
    </Grid>
</Window>

2. C# 后台逻辑

在后台实现文本与尺寸变化的处理,精准计算文本宽度并动态调整字号:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace TextBoxAutoResize
{
    public partial class MainWindow : Window
    {
        private const double DefaultFontSize = 24;
        private const double MinFontSize = 8; // 可自定义最小字号下限

        public MainWindow()
        {
            InitializeComponent();
            // 初始化时先做一次适配检查
            AdjustFontSizeToFit();
        }

        private void AutoResizeTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            AdjustFontSizeToFit();
        }

        private void AutoResizeTextBox_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            AdjustFontSizeToFit();
        }

        private void AdjustFontSizeToFit()
        {
            if (autoResizeTextBox == null) return;

            // 计算TextBox的可用显示宽度(扣除内边距)
            double availableWidth = autoResizeTextBox.ActualWidth - 
                                    autoResizeTextBox.Padding.Left - 
                                    autoResizeTextBox.Padding.Right;

            if (availableWidth <= 0) return;

            // 创建FormattedText对象计算文本实际宽度
            var formattedText = new FormattedText(
                autoResizeTextBox.Text,
                System.Globalization.CultureInfo.CurrentCulture,
                FlowDirection.LeftToRight,
                new Typeface(autoResizeTextBox.FontFamily, autoResizeTextBox.FontStyle, autoResizeTextBox.FontWeight, autoResizeTextBox.FontStretch),
                autoResizeTextBox.FontSize,
                Brushes.Black);

            // 文本超出时逐步缩小字号
            while (formattedText.Width > availableWidth && autoResizeTextBox.FontSize > MinFontSize)
            {
                autoResizeTextBox.FontSize -= 1;
                formattedText.SetFontSize(autoResizeTextBox.FontSize);
            }

            // 可选逻辑:文本过短时恢复默认字号(按需开启)
            // while (formattedText.Width < availableWidth * 0.9 && autoResizeTextBox.FontSize < DefaultFontSize)
            // {
            //     autoResizeTextBox.FontSize += 1;
            //     formattedText.SetFontSize(autoResizeTextBox.FontSize);
            // }
        }
    }
}

补充:WinForms 对应实现方案

如果你需要WinForms版本的实现,逻辑类似,代码如下:

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

namespace WinFormsTextBoxAutoResize
{
    public partial class MainForm : Form
    {
        private const float DefaultFontSize = 24f;
        private const float MinFontSize = 8f;

        public MainForm()
        {
            InitializeComponent();
            autoResizeTextBox.Font = new Font(autoResizeTextBox.Font.FontFamily, DefaultFontSize);
            // 绑定事件监听
            autoResizeTextBox.TextChanged += AutoResizeTextBox_TextChanged;
            autoResizeTextBox.SizeChanged += AutoResizeTextBox_SizeChanged;
        }

        private void AutoResizeTextBox_TextChanged(object sender, EventArgs e)
        {
            AdjustFontSizeToFit();
        }

        private void AutoResizeTextBox_SizeChanged(object sender, EventArgs e)
        {
            AdjustFontSizeToFit();
        }

        private void AdjustFontSizeToFit()
        {
            if (autoResizeTextBox == null) return;

            float currentSize = autoResizeTextBox.Font.Size;
            // 计算可用显示宽度
            float availableWidth = autoResizeTextBox.ClientSize.Width - 
                                   autoResizeTextBox.Padding.Left - 
                                   autoResizeTextBox.Padding.Right;

            if (availableWidth <= 0) return;

            // 测量文本实际宽度
            SizeF textSize = TextRenderer.MeasureText(autoResizeTextBox.Text, autoResizeTextBox.Font);

            // 文本超出时缩小字号
            while (textSize.Width > availableWidth && currentSize > MinFontSize)
            {
                currentSize -= 1;
                autoResizeTextBox.Font = new Font(autoResizeTextBox.Font.FontFamily, currentSize);
                textSize = TextRenderer.MeasureText(autoResizeTextBox.Text, autoResizeTextBox.Font);
            }

            // 可选逻辑:恢复默认字号(按需开启)
            // while (textSize.Width < availableWidth * 0.9 && currentSize < DefaultFontSize)
            // {
            //     currentSize += 1;
            //     autoResizeTextBox.Font = new Font(autoResizeTextBox.Font.FontFamily, currentSize);
            //     textSize = TextRenderer.MeasureText(autoResizeTextBox.Text, autoResizeTextBox.Font);
            // }
        }
    }
}

注意事项

  • 可根据需求修改MinFontSize的值,避免字号过小影响可读性
  • 若需要文本缩短后自动恢复默认字号,取消对应代码块的注释即可
  • WPF用FormattedText计算宽度更精准,WinForms则依赖TextRenderer.MeasureText

内容的提问来源于stack exchange,提问作者Matheus Miranda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:24:22