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

迁移至.NET 6后包含ToolStrip的UserControl设计时编辑功能失效

自定义UserControl内嵌ToolStrip .NET 6设计时编辑失效修复方案

失效核心原因

.NET 6+的Windows Forms重构了设计时支持体系,相较于.NET Framework有两点核心变化导致原代码失效:

  1. ControlDesigner.EnableDesignMode 方法的第二个参数要求必须和控件类中公开的子控件属性名完全匹配,原代码传参为"TS",和实际属性名NewToolStrip不匹配,.NET 6对该校验更加严格
  2. .NET 6+的WinForms设计器为进程外运行,需要额外的设计时SDK依赖和正确的项目配置

修复步骤

  1. 修改设计器类中EnableDesignMode的第二个参数,与公开属性名保持一致,推荐用nameof语法避免硬编码错误
  2. 给公开的NewToolStrip属性补充[Browsable(true)]特性,确保设计器能识别该属性
  3. 调整项目配置:
    • 目标框架设置为带windows后缀的版本,如net6.0-windows
    • 项目文件中开启<UseWindowsForms>true</UseWindowsForms>
    • 控件类库项目需安装对应版本的Microsoft.WinForms.Designer.SDK NuGet包

修正后完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:10