迁移至.NET 6后包含ToolStrip的UserControl设计时编辑功能失效
自定义UserControl内嵌ToolStrip .NET 6设计时编辑失效修复方案
失效核心原因
.NET 6+的Windows Forms重构了设计时支持体系,相较于.NET Framework有两点核心变化导致原代码失效:
ControlDesigner.EnableDesignMode方法的第二个参数要求必须和控件类中公开的子控件属性名完全匹配,原代码传参为"TS",和实际属性名NewToolStrip不匹配,.NET 6对该校验更加严格- .NET 6+的WinForms设计器为进程外运行,需要额外的设计时SDK依赖和正确的项目配置
修复步骤
- 修改设计器类中
EnableDesignMode的第二个参数,与公开属性名保持一致,推荐用nameof语法避免硬编码错误 - 给公开的
NewToolStrip属性补充[Browsable(true)]特性,确保设计器能识别该属性 - 调整项目配置:
- 目标框架设置为带windows后缀的版本,如
net6.0-windows - 项目文件中开启
<UseWindowsForms>true</UseWindowsForms> - 控件类库项目需安装对应版本的
Microsoft.WinForms.Designer.SDKNuGet包
- 目标框架设置为带windows后缀的版本,如
修正后完整代码
using System.ComponentModel; using System.ComponentModel.Design; using System.Windows.Forms; using System.Windows.Forms.Design; [Designer(typeof(MyDesigner))] public partial class AdvToolStrip : UserControl { public AdvToolStrip() { InitializeComponent(); } [Category("Appearance")] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ToolStrip NewToolStrip { get { return toolStrip1; } } } public class MyDesigner : ControlDesigner { public override void Initialize(IComponent c) { base.Initialize(c); AdvToolStrip ctl = (AdvToolStrip)c; // 第二个参数必须和公开的属性名完全匹配 EnableDesignMode(ctl.NewToolStrip, nameof(AdvToolStrip.NewToolStrip)); } }
验证方法
修复后重新编译整个解决方案,删除窗体上已添加的旧AdvToolStrip实例,重新拖入新编译的控件,即可直接点击内部ToolStrip添加各类项,所有设计时修改会自动序列化到对应窗体的Designer.cs文件中。
内容的提问来源于stack exchange,提问作者Domenico Formoso
相关产品推荐
相关产品推荐

