窗体设计器和命名空间

本文关键字:命名空间 窗体 | 更新日期: 2023-09-27 18:31:31

我在经常使用的 DLL 中有一个静态事件 - Toolkit.Dialogs.ExitConfirm

我可以使用此事件的唯一方法是修改在表单中添加事件的行。设计器.cs。示例:

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

成为

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Toolkit.Dialogs.ExitConfirm);

如果我尝试通过"属性>事件"页面添加它,它会给我此错误:"Toolkit.Dialogs.ExitConfirm"不是有效的标识符。

有没有办法允许表单设计器引用来自其他类/命名空间的事件?

编辑:有些人在视觉提示方面工作得更好,所以这里有一些图像来定义问题:https://i.stack.imgur.com/3fsRd.jpg

第一张图片显示了我必须如何使其在Visual Studio中工作 - 一个调用事件的事件。

第二张图片显示了我实际想要做的事情。

第三个图像是我手动键入方法名称时发生的错误。

窗体设计器和命名空间

我在 DLL 中有一个静态事件

没有,你只有一个方法。 FormClosing 是事件,如果方法具有正确的签名,则它可以是事件处理程序方法。 设计师根本不支持你尝试做的事情,你必须停止尝试。 有两种合理的解决方案,都涉及在窗体类中编写代码。 首先,您可以在构造函数中执行此操作:

    public Form1() {
        InitializeComponent();
        this.FormClosing += Toolkit.Dialogs.ExitConfirm;
    }

或者理智的,因为一个班级听自己的事件是没有意义的:

    protected override void OnFormClosing(FormClosingEventArgs e) {
        Toolkit.Dialogs.ExitConfirm(this, e);
        if (!e.Cancel) base.OnFormClosing(e);
    }

当您从此形式派生另一种形式时,它具有正常工作的巨大优势。 这也是对您可能真正应该做的事情的强烈暗示。 看起来您正在尝试为对话框编写通用代码。 "工具包"命名空间暗示了这一点。 通过让此工具包实现基窗体类来使其正常工作。 现在,您可以在没有任何代码或事件处理程序的情况下设计窗体类:

public partial class Form1 : Toolkit.Dialogs.BaseDialog {
   // etc
}

假设 Toolkit.Dialogs.BaseDialog 是从 Form 派生的类,它覆盖了 OnFormClosesing()。 也许它还应该有一个名为"ConfirmOnClose"的公共属性,类型为bool。 启用"退出确认"逻辑。 您可以在设计器中轻松设置属性。

WinForms 设计器不是为了做到这一点而设计的。我有点惊讶下次您更改设计器时不会丢失您的事件。

关于其他方法的一些想法,你可以做到这一点:

  • 您可以创建一个为您挂钩事件的 Form 类,并从该基类中降临所有其他窗体。然后你会得到无处不在的行为。
  • 您可以创建一个为您挂钩事件的实用方法,并从每个窗体的构造函数调用它。
  • 您可以创建一个扩展方法来挂钩事件,然后显示窗体,并在显示窗体的任何位置调用扩展方法(而不是调用 Show )。

基类可能是最简单的解决方案,只要您尚未将表单继承用于其他目的。

您可以在申请表的表单关闭事件中调用此方法"Toolkit.Dialogs.ExitConfirm",并将所需的参数传递给Toolkit.Dialogs.ExitConfirm