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

参考来源

相关推荐
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
神仙别闹1 天前
基于C#+MySQL实现(WinForm)个人聊天室软件
c#
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
Polevne1 天前
C# SFTP客户端实现文件传输
c#·ssh
samble1 天前
从零搭建灌装监控系统(四):深色主题与样式系统,ResourceDictionary 统一管理
c#·wpf·mvvm·样式·工业控制
cjp5601 天前
024 . WPF MVVM类封装优化
c#
淡海水2 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
asdzx672 天前
如何使用 C# 提取 PPT 文本与图片
c#·ppt·提取文本
2501_930707782 天前
使用C#代码使用条件格式为 Excel 隔行设置颜色
c#·excel
何以解忧唯有撸码2 天前
【开源】c#造个轮子-日程安排工具
c#·自定义控件