C# CAD二次开发中如何退出窗口

在 C# AutoCAD 二次开发中,退出已加载的 Windows 窗口(如 WinForms 或 WPF 窗体)的核心方法是调用窗体的 Close() 方法或设置 DialogResult 属性。具体实现取决于窗口的显示方式(模态或非模态)以及是否需要与 AutoCAD 命令流交互。

1. 模态窗口的退出

模态窗口使用 ShowDialog() 显示,退出时应设置 DialogResult 或直接调用 Close()

代码示例:

csharp 复制代码
// 假设你的窗体类名为 MyForm
public partial class MyForm : Form
{
    private void btnOK_Click(object sender, EventArgs e)
    {
        // 执行你的逻辑...
        this.DialogResult = DialogResult.OK; // 设置对话框结果会自动关闭窗口 // 或者直接调用 this.Close();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
        // 或者直接调用 this.Close();
    }
}

// 在 AutoCAD 命令中调用[CommandMethod("ShowMyDialog")]
public void ShowMyDialog()
{
    using (MyForm form = new MyForm())
    {
        DialogResult result = Application.ShowModalDialog(form);
        // 根据 result 处理后续逻辑 }
}

2. 非模态窗口的退出

非模态窗口使用 Show() 显示,必须显式调用 Close() 来退出,并需妥善管理窗口生命周期。

代码示例:

csharp 复制代码
public partial class MyModelessForm : Form
{
    // 持有窗体实例的静态引用,便于管理 private static MyModelessForm _instance;

    [CommandMethod("ShowModelessForm")]
    public static void ShowModelessForm()
    {
        if (_instance == null || _instance.IsDisposed)
        {
            _instance = new MyModelessForm();
            _instance.Show();
        }
        else
        {
            _instance.Activate();
        }
    }

    // 窗体内部的关闭按钮事件 private void btnClose_Click(object sender, EventArgs e)
    {
        this.Close(); // 关闭当前窗体实例 }

    // 重写 OnFormClosed 以清理静态引用 protected override void OnFormClosed(FormClosedEventArgs e)
    {
        _instance = null;
        base.OnFormClosed(e);
    }
}

// 你也可以通过一个命令来主动关闭非模态窗口
[CommandMethod("CloseModelessForm")]
public static void CloseModelessForm()
{
    if (_instance != null && !_instance.IsDisposed)
    {
        _instance.Close();
        _instance = null;
    }
}

3.关键注意事项对比表

特性 模态窗口 (ShowDialog) 非模态窗口 (Show)
显示方法 Application.ShowModalDialog(form)form.ShowDialog() form.Show()
阻塞性 阻塞 AutoCAD 命令流,等待窗口关闭 不阻塞,与 AutoCAD 并行运行
退出方式 设置 DialogResult 或调用 Close() 必须显式调用 Close()
生命周期管理 通常使用 using 语句自动释放 需手动管理实例,防止内存泄漏或重复创建
适用场景 需要用户立即响应、中断当前操作的对话框 需要持续显示、与绘图区交互的工具面板

4. 确保与 AutoCAD 应用程序集成的关闭

如果你的窗口需要响应 AutoCAD 事件(如文档关闭)或确保在 AutoCAD 退出时清理资源,可以订阅相应事件。

代码示例:

csharp 复制代码
public partial class MyAutoCADForm : Form
{
    public MyAutoCADForm()
    {
        InitializeComponent();
        // 订阅 AutoCAD 应用程序或文档关闭事件
        Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.DocumentDestroyed += DocumentManager_DocumentDestroyed;
 this.FormClosed += MyAutoCADForm_FormClosed;
    }

    private void DocumentManager_DocumentDestroyed(object sender, Autodesk.AutoCAD.ApplicationServices.DocumentDestroyedEventArgs e)
    {
        // 当文档关闭时,可以决定是否关闭窗体
        if (/* 你的判断条件 */)
        {
            this.Invoke(new Action(() => this.Close()));
        }
    }

    private void MyAutoCADForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        // 清理事件订阅,防止内存泄漏 Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.DocumentDestroyed -= DocumentManager_DocumentDestroyed;
    }
}

核心要点总结:

  1. 模态窗口 :优先通过设置 this.DialogResult 来关闭。
  2. 非模态窗口 :必须调用 this.Close(),并妥善管理单例实例。
  3. 资源管理 :使用 using 语句或重写 OnFormClosed 方法确保窗体及其资源被正确释放。
  4. 事件清理:如果订阅了外部事件(如 AutoCAD 事件),务必在窗体关闭时取消订阅。

参考来源

相关推荐
yuhulkjv3357 小时前
Claude表格复制到word不再崩溃,AI导出鸭批量导出+格式无损一键搞定
人工智能·ai·c#·word·ai导出鸭
arbboter12 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
微小冷13 小时前
海康威视相机C#二次开发环境配置
数码相机·c#·.net·海康威视·相机开发
吴可可12317 小时前
C#重写机制与CAD图元开发要点
c#
A_nanda17 小时前
c#WPF开发常见问题
开发语言·c#·wpf
唐青枫17 小时前
别只会解析参数:C#.NET Spectre.Console.Cli 命令行工具实战详解
c#·.net
AI刀刀18 小时前
腾讯元宝粘贴到 word 格式混乱,AI 导出鸭一键规整排版
人工智能·c#·word·ai导出鸭
微小冷19 小时前
海康威视相机C#二次开发指图像采集
数码相机·c#·二次开发·机器视觉·海康威视·mvs·相机开发
rick97721 小时前
WinForms 父子窗体数据传递的进化之路:从参数注入到事件回传的完美闭环
c#
淡海水21 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#