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这听起来像是一个新问题。如果这个答案回答了你的问题,那么接受它。如果答案有用,就投票表决。以新问题的形式发布您当前的问题,以及您用于注册表单的代码。