WinForms自定义TextBoxUnderline控件设计器中尺寸变为设定值1.5倍如何解决
WinForm自定义TextBox尺寸自动放大1.5倍问题解决方案
问题原因
- 构造函数内直接设置
Size的操作会被WinForm设计器的自动DPI缩放逻辑覆盖,若系统显示缩放比例为150%,就会出现尺寸变为设定值1.5倍的现象。 - 原生
TextBox控件即使设置AutoSize = false,默认尺寸逻辑仍会优先适配字体参数,构造函数内的尺寸赋值优先级低于控件初始化的默认规则。 - 设置
MaximumSize后尺寸正常的原因是该参数为尺寸限制最高优先级,会强制覆盖缩放后的尺寸,但是会带来后续无法自由调大尺寸的问题。
修复步骤
- 删除构造函数中
this.Size = new Size(200, 200);这行代码 - 在
TextBoxUnderline类中重写DefaultSize属性,该属性定义的是控件的默认初始尺寸,不会被设计器缩放逻辑随意覆盖,修改后完整代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing; namespace XYZ { class TextBoxUnderline : TextBox { // 重写默认尺寸属性 protected override Size DefaultSize { get { return new Size(200, 200); } } public TextBoxUnderline() { this.BorderStyle = BorderStyle.None; this.AutoSize = false; this.BackColor = SystemColors.Control; this.MouseEnter += TextBoxUnderline_MouseEnter; this.MouseLeave += TextBoxUnderline_MouseLeave; this.GotFocus += TextBoxUnderline_GotFocus; this.LostFocus += TextBoxUnderline_LostFocus; this.Controls.Add(new Label() { Height = 1, Dock = DockStyle.Bottom, BackColor = Color.Black }); } void TextBoxUnderline_MouseLeave(object sender, EventArgs e) { if (((TextBoxUnderline)sender).Focused == false) { ((TextBoxUnderline)sender).BackColor = SystemColors.Control; } } void TextBoxUnderline_MouseEnter(object sender, EventArgs e) { ((TextBoxUnderline)sender).BackColor = Color.White; } private void TextBoxUnderline_LostFocus(object sender, EventArgs e) { ((TextBoxUnderline)sender).BackColor = SystemColors.Control; } private void TextBoxUnderline_GotFocus(object sender, EventArgs e) { ((TextBoxUnderline)sender).BackColor = Color.White; } } }
- 重新生成项目后再次将控件拖拽到设计视图,初始尺寸就会是你设定的200*200,后续可以在属性面板自由调整控件尺寸,没有最大尺寸限制。
内容的提问来源于stack exchange,提问作者Filledille
相关产品推荐
相关产品推荐

