自定义ToolStrip为何移除Designer.cs中PerformLayout?如何恢复?
问题描述
假设存在一个包含ToolStrip的WinForms窗体,其Form1.Designer.cs文件中有两行布局代码:
this.toolStrip1.ResumeLayout(false); this.toolStrip1.PerformLayout();
通过以下代码自定义了MyToolStrip:
[Designer(typeof(System.Windows.Forms.Design.ControlDesigner))] public class MyToolStrip : ToolStrip {}
将窗体中的ToolStrip替换为MyToolStrip后,Designer.cs中的this.toolStrip1.PerformLayout();语句被自动移除,导致ToolStripComboBox等子控件出现尺寸异常。
原因分析
- 原生
ToolStrip使用的是专属的ToolStripDesigner设计器,这个设计器针对ToolStrip作为容器控件的特性,会在生成设计器代码时自动添加PerformLayout()调用,确保暂停布局后强制刷新,保证子控件的尺寸计算正确。 - 自定义的
MyToolStrip指定了普通控件的基础设计器ControlDesigner,它没有适配ToolStrip的布局逻辑。ControlDesigner认为ResumeLayout(false)之后无需额外调用PerformLayout(),所以在生成代码时自动移除了这行语句,进而导致子控件布局异常。
解决方法
不要替换为普通的ControlDesigner,而是使用ToolStrip原生的ToolStripDesigner作为自定义控件的设计器,修改后的代码如下:
using System.Windows.Forms.Design; [Designer(typeof(ToolStripDesigner))] public class MyToolStrip : ToolStrip {}
这样设计器会和原生ToolStrip一样,自动在Designer.cs中保留PerformLayout()语句,无需手动修改设计器文件即可恢复正常布局。
内容的提问来源于stack exchange,提问作者Wollmich
相关产品推荐
相关产品推荐

