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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:54:56