自定义TPButton运行时尺寸大于设计器显示的原因排查
设计器显示效果:
运行时显示效果:
TPButton类代码
public class TPButton : Button { public TPButton() { InitializeComponent(); } private void InitializeComponent() { this.SuspendLayout(); // // TPButton // this.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.Size = new System.Drawing.Size(75, 26); this.ResumeLayout(false); } }
窗体EinAusschlussV的设计器代码
partial class EinAusschlussV { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.tpComboBox1 = new Infrastructure.CustomControls.TPComboBox(); this.lblIln = new Infrastructure.CustomControls.TPLabel(); this.tpButton1 = new Infrastructure.CustomControls.TPButton(); this.tpButton2 = new Infrastructure.CustomControls.TPButton(); this.SuspendLayout(); // // tpComboBox1 // this.tpComboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.tpComboBox1.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tpComboBox1.FormattingEnabled = true; this.tpComboBox1.Location = new System.Drawing.Point(45, 11); this.tpComboBox1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.tpComboBox1.Name = "tpComboBox1"; this.tpComboBox1.Size = new System.Drawing.Size(121, 25); this.tpComboBox1.TabIndex = 0; // // lblIln // this.lblIln.AutoSize = true; this.lblIln.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblIln.Location = new System.Drawing.Point(12, 14); this.lblIln.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.lblIln.Name = "lblIln"; this.lblIln.Size = new System.Drawing.Size(27, 17); this.lblIln.TabIndex = 1; this.lblIln.Text = "ILN"; // // tpButton1 // this.tpButton1.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tpButton1.Location = new System.Drawing.Point(172, 10); this.tpButton1.Name = "tpButton1"; this.tpButton1.Size = new System.Drawing.Size(75, 25); this.tpButton1.TabIndex = 2; this.tpButton1.Text = "tpButton1"; this.tpButton1.UseVisualStyleBackColor = true; // // tpButton2 // this.tpButton2.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tpButton2.Location = new System.Drawing.Point(172, 241); this.tpButton2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.tpButton2.Name = "tpButton2"; this.tpButton2.Size = new System.Drawing.Size(75, 26); this.tpButton2.TabIndex = 3; this.tpButton2.Text = "tpButton2"; this.tpButton2.UseVisualStyleBackColor = true; // // EinAusschlussV // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(660, 497); this.Controls.Add(this.tpButton2); this.Controls.Add(this.tpButton1); this.Controls.Add(this.lblIln); this.Controls.Add(this.tpComboBox1); this.Margin = new System.Windows.Forms.Padding(4); this.Name = "EinAusschlussV"; this.Text = "EinAusschlussV"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private TPComboBox tpComboBox1; private TPLabel lblIln; private TPButton tpButton1; private TPButton tpButton2; }
问题分析:尺寸异常的原因
问题出在自定义控件的硬编码属性与窗体自动缩放机制的冲突:
- TPButton构造函数硬编码Size:在
InitializeComponent里直接设置了Size = new System.Drawing.Size(75, 26),这个设置会在控件实例化时执行,覆盖设计器为每个按钮(比如tpButton1的Size(75,25))设置的尺寸。 - 窗体自动缩放的影响:窗体
EinAusschlussV的AutoScaleMode是Font,AutoScaleDimensions对应默认的8pt字体缩放比例。设计器中,控件尺寸会根据窗体的缩放规则自动适配,但运行时TPButton的硬编码Size没有经过窗体的缩放计算,直接以固定值渲染,导致显示尺寸比设计器中更大。 - 控件初始化逻辑错误:自定义控件不应该在构造函数中固定设置Size这类布局属性,设计器生成的控件属性应该拥有更高优先级,硬编码会破坏窗体的布局适配机制。
内容的提问来源于stack exchange,提问作者Anton Schrage
相关产品推荐
相关产品推荐

