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

.NET 7 WinForms设计器打开窗体触发异常的解决咨询

解决WinForms基类重写OnHandleCreated/OnHandleDestroyed导致设计器异常的问题

问题根源

VS 2022的窗体设计器在加载继承自CourierForm的窗体时,会实例化窗体并触发OnHandleCreated和OnHandleDestroyed方法。但设计环境里Wall.flb这类业务对象并未初始化,强行执行位置加载、保存逻辑会触发异常,直接导致窗体布局混乱。

修复方案

给重写的方法加上设计模式判断,仅在程序运行时(非设计模式)执行位置相关逻辑:

修改后的代码

protected override void OnHandleCreated(EventArgs e)
{
    base.OnHandleCreated(e);
    
    // 仅在运行时执行位置恢复逻辑
    if (!DesignMode)
    {
        FormLocation? fl = Wall.flb.Get(this.Name);
        if (fl is not null)
        {
            this.Location = new Point(fl.XLocation, fl.YLocation);
            this.Width = fl.Width;
            this.Height = fl.Height;
        }
    }
}

protected override void OnHandleDestroyed(EventArgs e)
{
    // 仅在运行时且Wall.lu初始化完成时执行位置保存逻辑
    if (!DesignMode && Wall.lu is not null)
    {
        Wall.flb.Register(this);
    }
    
    base.OnHandleDestroyed(e);
}

关键说明

  • DesignMode是WinForms控件自带的属性,设计器环境中该值为true,程序运行时为false,用它可以隔离设计时和运行时的代码逻辑。
  • 把位置相关的业务逻辑都包裹在!DesignMode判断里,就能避免设计器执行未初始化的业务代码,解决布局混乱和异常问题。

内容的提问来源于stack exchange,提问作者Syed Irfan Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:23:25