在 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;
}
}
核心要点总结:
- 模态窗口 :优先通过设置
this.DialogResult来关闭。 - 非模态窗口 :必须调用
this.Close(),并妥善管理单例实例。 - 资源管理 :使用
using语句或重写OnFormClosed方法确保窗体及其资源被正确释放。 - 事件清理:如果订阅了外部事件(如 AutoCAD 事件),务必在窗体关闭时取消订阅。