C# 从类库监视多个表单

C# 从类库监视多个表单,c#,winforms,C#,Winforms,我试图在类库中编写一个类NvApplicationContext,该类继承自ApplicationContext,我将使用它以多种形式监视活动 public class NvApplicationContext : ApplicationContext { // ... public NvApplicationContext(Form f) { } // ... } 但是,我似乎只能从我的最终项目中以一种形式传递(一个Form1的实例): NvApplic

我试图在类库中编写一个类
NvApplicationContext
,该类继承自
ApplicationContext
,我将使用它以多种形式监视活动

public class NvApplicationContext : ApplicationContext {
    // ...

    public NvApplicationContext(Form f) {

    }

    // ...
}
但是,我似乎只能从我的最终项目中以一种形式传递(一个
Form1
的实例):

NvApplicationContext nvca = new NvApplicationContext(new Form1()); 
Application.Run(nvca);
var nvca = new NvApplicationContext(new Form1(), new Form2(), new Form3()); 
Application.Run(nvca);

其他表单是否应该自动识别?或者,
NvApplicationContext
如何监控多个表单?

您的
NvApplicationContext
需要告知您希望上下文类管理的任何表单实例;它不是自动发生的

我可以想出多种方法来构建此结构:

  • 允许构造函数使用
    参数获取多个
    表单
    实例
  • 将RegisterPerform方法添加到
    NvApplicationContext
    并在创建需要监视的表单时调用
  • 将CreateForm方法添加到
    NvApplicationContext
    并使用它创建需要监视的表单
  • 在类库中,创建一个在创建时注册自身的基窗体类,并使
    Form1
    Form2
    继承自该基类

允许构造函数采用多个
表单
s 在类库中:

public class NvApplicationContext : ApplicationContext {
    public NvApplicationContext(params Form[] forms) {
        // register event handler on each form here
    }
}
在最终项目中使用如下方式:

NvApplicationContext nvca = new NvApplicationContext(new Form1()); 
Application.Run(nvca);
var nvca = new NvApplicationContext(new Form1(), new Form2(), new Form3()); 
Application.Run(nvca);

使用
注册表执行
方法 定义
NvApplicationContext
的静态实例:

public class NvApplicationContext : ApplicationContext {
    public static readonly NvApplicationContext Current = new NvApplicationContext();

    public void RegisterForm(Form frm) {
        // register event handler on form here
    }
}
创建表单后,请调用
RegisterForm
。这可能在调用
应用程序之前。运行

NvApplicationContext.Current.RegisterForm(new Form1());
NvApplicationContext.Current.RegisterForm(new Form2());
NvApplicationContext.Current.RegisterForm(new Form3());
Application.Run(NvApplicationContext.Current);
或应用程序中的任何位置,因为
NvApplicationContext.Current
是一个
静态
字段,全局可用


使用
CreateForm
方法 另一个选项是通过
NvApplicationContext
创建任何需要管理的表单,它将负责注册表单。这假设上下文的
静态
实例,如前一节所述:

public class NvApplicationContext : ApplicationContext {
    public static readonly NvApplicationContext Current = new NvApplicationContext();

    public T CreateForm<T>() where T : Form, new() {
        var ret = new T();

        // register event handlers here

        return ret;
    }
}

使用基本表单 您可以编写一个这样的基表单类(在类库中或在最终项目中),使用以前的
静态
实例调用
RegisterForm

public class BaseForm : Form {
    public BaseForm() {
        NvApplicationContext.Current.RegisterForm(this);
    }
}
并使用UI创建从基类继承的表单:

或者,您可以从表单的代码后面执行此操作。将基类从
Form
修改为
BaseForm

public partial class Form1 : BaseForm {
    public Form1() {
        InitializeComponent();
    }
}
设置继承后,无论何时创建表单的新实例,它都将自动注册到
NvApplicationContext.Current

new Form1();
new Form2();
new Form3();
Application.Run(NvApplicationContext.Current);

你能更具体地说明你想做什么吗?“监视多个表单”是什么意思?您的
ApplicationContext
派生类需要保存对您正在创建的新
表单的引用;完成后,它不会自动关闭所有表单。再见,对不起,我的错。我有一个包含两个表单的应用程序,我想使用类库监控这两个表单。应用程序在启动时打开form1,在单击按钮时打开另一个表单。我是这样使用ApplicationContext的:-NvApplicationContext nvca=new NvApplicationContext(new Form1());应用程序运行(nvca);因此,我得到的只是form1的参考。如何在类库中获取form2的引用。NVApplicationContext正在扩展ApplicationContext,该类位于类库中。
ApplicationContext
模式已被@Zev Spitz链接的(好的,顺便说一句)示例所涵盖。另一种方法是使用。但这取决于你所说的监控是什么意思。试着以更一致的方式解释(通过编辑你的问题)。@Jimi你会对这两个链接的答案中的任何一个提出改进建议吗?谢谢你的努力。我是这样做的(尝试了第一种和第二种方法)。它正在注册事件,但未识别任何事件。似乎我必须添加一些额外的内容来捕捉窗口事件。例如,问题:-表单加载完毕,事件处理程序加起来了,但当我单击它时,根据单击事件处理程序,什么也没有发生。@user10122634这听起来像是一个新问题。如果这个答案回答了你的问题,那么接受它。如果答案有用,就投票表决。以新问题的形式发布您当前的问题,以及您用于注册表单的代码。