2

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

我可以使用此事件的唯一方法是修改在 form.Designer.cs 中添加事件的行。例子:

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

变成

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

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

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

编辑:有些人在视觉提示上工作得更好,所以这里有一些图像来定义问题:http: //imgur.com/a/RaLMg

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

第二张图片显示了我实际上正在尝试做的事情。

第三张图片是我手动键入方法名称时出现的错误。

4

3 回答 3

1

我在 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 是从覆盖 OnFormClosing() 的 Form 派生的类。也许它还应该有一个名为“ConfirmOnClose”的 bool 类型的公共属性。这启用了“ExitConfirm”逻辑。您可以毫无问题地在设计器中设置该属性。

于 2012-04-18T12:51:35.180 回答
0

您可以在应用程序表单的表单关闭事件中调用此方法“Toolkit.Dialogs.ExitConfirm”并将所需参数传递给 Toolkit.Dialogs.ExitConfirm

于 2012-04-18T05:12:55.920 回答
0

WinForms 设计器的设计初衷并非如此。我有点惊讶它不会在您下次更改设计师时丢失您的活动。

关于可以使这项工作的其他方法的一些想法:

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

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

于 2012-04-18T12:14:40.133 回答