TextBox的宽度随输入的文本的大小而改变

本文介绍如何使用ASP.NET结合JavaScript实现对文本框输入字符数量的限制,并提供了完整的HTML与C#代码示例。

 PS:转载请说明出处!不然强烈BS

原贴地址:http://topic.youkuaiyun.com/u/20090831/15/5a3e9399-e1ed-421e-b7da-5de5d1ee78a3.html?seed=491772384&r=59460312#r_59460312

 

<think>我们正在解决C#中TextBox控件尺寸随字体变化而变化的问题。 通常,TextBox控件在字体改变时会自动调整大小以适应新字体(例如,当字体变大时,控件高度会增加)。如果我们希望固定TextBox的尺寸,即使字体变化也改变,可以考虑以下方法: 方法1:设置TextBox的AutoSize属性为false(但TextBox并没有AutoSize属性,这个属性常见于Label控件) 实际上,TextBox控件默认就是AutoSize=false的,但为什么字体变大时高度还是会变呢?这是因为TextBox的默认行为:当字体改变时,为了能够显示完整字体,它会自动调整高度。 方法2:使用多行TextBox(Multiline)并固定高度 对于单行TextBox,当字体变大时,高度会自动调整。但如果我们将TextBox设置为多行(Multiline=true),然后固定其高度,就可以防止高度变化。但这样可能会允许用户输入多行文本符合单行输入的需求。 方法3:自定义控件,重写相关方法 我们可以通过创建自定义的TextBox控件,重写设置字体的相关方法,在字体改变调整控件大小。 方法4:在字体改变后手动重置高度 在字体改变的事件中,将TextBox的高度设置回原来的值。 下面我们重点介绍方法4(简单易行)和方法3(更彻底)。 方法4示例代码: 在表单代码中,我们可以监听TextBox的字体改变事件(实际上TextBox没有直接的字体改变事件,但我们可以通过订阅其他事件来间接实现,比如在设置字体后触发的事件中处理): 我们可以考虑在表单的Load事件中记录初始高度,然后在每次字体改变后重置高度。但是注意,字体改变可能是通过代码设置的,所以我们在设置字体的地方手动重置高度。 例如: 我们有一个TextBox命名为textBox1,在初始化时记录初始高度,然后在需要改变字体的地方,设置字体后立即将高度重置。 步骤: 1. 在窗体构造函数或Load事件中记录初始高度。 2. 在设置字体的事件中(例如按钮点击事件)重置高度。 代码示例: ``` private int originalHeight; // 用于保存初始高度 private void Form1_Load(object sender, EventArgs e) { originalHeight = textBox1.Height; } // 改变字体的按钮点击事件 private void button1_Click(object sender, EventArgs e) { textBox1.Font = new Font(textBox1.Font.FontFamily, 16); // 增大字体 // 设置完后重置高度 textBox1.Height = originalHeight; } ``` 但是这种方法有一个缺点:如果字体变得过大,固定高度可能导致文本显示完整(被裁剪)。因此,我们需要确保固定的高度足够显示字体(比如使用最大可能字体的高度)。 方法3:创建自定义TextBox控件,重写SetBoundsCore方法 我们可以通过创建一个自定义的TextBox,重写SetBoundsCore方法,在调整大小时忽略字体变化引起的高度变化。但是注意,SetBoundsCore方法在控件大小改变时都会被调用,我们需要区分是程序主动改变大小还是因为字体改变而自动调整大小。 然而,TextBox控件内部在字体改变时会自动调整高度,这个机制我们无法直接关闭。但我们可以通过设置一个标志位来阻止高度的自动变化。 自定义TextBox类示例: ``` public class FixedHeightTextBox : TextBox { private bool inSetBounds = false; protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { // 如果指定了高度,或者没有指定高度(即由系统自动调整)时,我们希望固定高度 if ((specified & BoundsSpecified.Height) == 0 && !inSetBounds) { // 保存当前的高度 height = this.Height; } base.SetBoundsCore(x, y, width, height, specified); } // 重写Font属性,在设置字体时阻止高度改变 public override Font Font { get => base.Font; set { inSetBounds = true; base.Font = value; inSetBounds = false; } } } ``` 但是,这种方法可能还够完善,因为字体改变TextBox内部可能会触发其他调整大小的逻辑。还有一种方法是完全禁止自动调整高度,我们可以强制在重写的SetBoundsCore方法中始终使用固定的高度(比如最初设计时的高度)。 改进版本: ``` public class FixedHeightTextBox : TextBox { private int fixedHeight = 0; public FixedHeightTextBox() { // 在构造时记录初始高度,但注意此时高度可能为0,因为还没有创建句柄 // 所以我们在OnHandleCreated中记录 } protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); // 当控件句柄创建后,记录当前高度作为固定高度 if (fixedHeight == 0) fixedHeight = this.Height; } protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { // 如果我们希望固定高度,那么管传入的高度是多少,我们使用固定的高度 // 但是要注意,如果程序确实需要改变高度(比如我们通过代码改变),那么我们需要一种机制来允许 // 这里我们只处理非手动指定高度的情况,如果指定了高度,则使用指定的高度(也就是说,如果程序主动设置了高度,则使用新高度,并且更新固定高度) if ((specified & BoundsSpecified.Height) != 0) { // 如果指定了高度,更新固定高度 fixedHeight = height; } else { // 否则,使用固定高度 height = fixedHeight; } base.SetBoundsCore(x, y, width, height, specified); } } ``` 这样,无论字体如何变化,高度始终为固定值。但是,这样可能导致字体过大时文本显示全。因此,使用固定高度时,要确保高度足够显示字体。 总结: 根据需求选择方法: - 如果只是偶尔在代码中改变字体,使用方法4(手动重置高度)简单有效。 - 如果需要全局控制,并且希望控件在任何情况下都改变高度,使用方法3(自定义控件)更合适。 注意事项:固定高度后,如果字体过大,文本可能会显示全(被裁剪),因此需要合理设置高度。 引用说明: 在C#中,TextBox控件的高度随字体变化是默认行为。我们通过自定义控件或手动重置高度来固定尺寸。参考了TextBox控件的行为和SetBoundsCore方法的重写方法[^1]。 §§相关问题§§ 1. 在C#中,如何使TextBox控件的高度自适应内容的变化? 2. 如何创建自定义的Windows Forms控件? 3. 在C#中,除了TextBox,还有哪些控件在字体变化时会自动调整大小? </think>在 C# 中,要使 TextBox 控件尺寸随字体变化而变化,可以通过以下几种方法实现: ### 方法 1:设置固定尺寸并禁用自动调整 ```csharp // 初始化时设置固定尺寸 textBox1.AutoSize = false; // 禁用自动调整尺寸 textBox1.Size = new Size(200, 30); // 固定宽度和高度 ``` ### 方法 2:重写 TextBox 的行为(创建自定义控件) 1. 创建自定义 TextBox 类: ```csharp public class FixedSizeTextBox : TextBox { protected override void OnFontChanged(EventArgs e) { // 阻止字体变化时自动调整尺寸 base.OnFontChanged(e); this.Height = base.PreferredHeight; // 保持原始高度 } } ``` 2. 在窗体设计器中替换原有 TextBox: ```csharp // 在窗体构造函数中替换控件 this.Controls.Remove(textBox1); var fixedTextBox = new FixedSizeTextBox { Location = textBox1.Location, Size = textBox1.Size, Text = textBox1.Text }; this.Controls.Add(fixedTextBox); ``` ### 方法 3:手动锁定尺寸(事件处理) ```csharp private Size originalSize; private void Form1_Load(object sender, EventArgs e) { originalSize = textBox1.Size; // 保存初始尺寸 } private void textBox1_FontChanged(object sender, EventArgs e) { textBox1.Size = originalSize; // 字体变化时重置尺寸 } ``` ### 方法 4:使用 Panel 容器控制尺寸 ```csharp Panel container = new Panel { Size = new Size(200, 30), BorderStyle = BorderStyle.FixedSingle }; container.Controls.Add(textBox1); textBox1.Dock = DockStyle.Fill; // 填充容器 this.Controls.Add(container); ``` ### 注意事项 1. **字体裁剪问题**: 固定尺寸后,过大的字体会被裁剪(显示完整),需确保尺寸足够容纳最大字体 2. **多行文本框**: 对于 `Multiline=true` 的文本框,需要额外处理高度计算: ```csharp // 在自定义控件中 protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); this.Height = base.PreferredHeight; // 根据行数动态调整 } ``` 3. **DPI 缩放**: 在高DPI环境下,使用 `this.AutoScaleMode = AutoScaleMode.Dpi;` 保持比例一致性 > 推荐优先使用方法 2(自定义控件),这是最稳定可靠的解决方案。Windows Forms 文本框默认会根据字体自动调整高度,通过禁用 `AutoSize` 特性并固定尺寸可有效解决此问题[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值