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 事件),务必在窗体关闭时取消订阅。

参考来源

相关推荐
吃一碗粉只付一碗钱7 小时前
16-SqlSugar多库ConfigId与按实体选连接
sqlserver·c#
rockey6278 小时前
AScript之字符串模板
c#·.net·script·expression·动态脚本
will_net9 小时前
Redis集群部署+Redis 链接地址放入Aollo +c#项目接入Redis
redis·c#·bootstrap
BuHuaX16 小时前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
asdzx6717 小时前
C# 操作 PDF 元数据:从属性写入到字段提取的完整流程
前端·pdf·c#
氷凌公子19 小时前
算法与UI拆分中遇到的问题及解决方式
c#·onnx·yolov26
1-1=019 小时前
C# 泛型
c#·.net·.netcore
椒颜皮皮虾྅2 天前
让文档不止于文字:DeploySharp + PP-Structure,打通版面分析与表格重建
开发语言·学习·c#·.net·cuda
椒颜皮皮虾྅2 天前
一套 C# 接口,解锁四类视觉任务:DeploySharp 分类、分割、关键点与旋转框实战
开发语言·分类·c#