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

参考来源

相关推荐
影寂ldy1 小时前
C# WinForm 三种自定义控件 + 完全自定义重绘控件知识点
开发语言·c#
-银雾鸢尾-1 小时前
C#中的Dictionary相关方法
开发语言·c#
lzhdim2 小时前
C# 中读取CPU、硬盘和内存温度
开发语言·c#
WarPigs3 小时前
.NET项目app.Config笔记
c#·.net
weixin_4280053018 小时前
C#调用 AI学习从0开始-第3阶段RAG向量数据库-文档切分与入库第15天
人工智能·学习·c#·向量数据库·rag·qdrant·文档切分与入库
心平气和量大福大19 小时前
C#-WPF-布局-Grid
c#·wpf·visual studio
TeamDev19 小时前
JxBrowser 9.3.1 版本发布啦!
java·前端·javascript·c#·混合应用·jxbrowser·浏览器控件
格林威1 天前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机