Ita*_*aro 7 .net c# visual-studio winforms
我需要创建一个非可视组件,FooComponent它将Bar对其所在类型的所有控件进行一些管理.
我有以下约束:
FooComponent只能添加到表单.FooComponent每形式是允许的.FooComponent应该注册到表单关闭事件,并在它触发时和所有Bar的函数上发送一些函数,并e.Cancel根据返回的值发送值.上面的#1和#2应该在运行时和设计时强制执行.#3事件注册应该自动进行,而不是由FooComponent用户进行.
我搜索谷歌和MSDN的一些帮助,阅读Component和ComponentDesigner课程,但我没有找到任何救援.
我该怎么办?
(1) 要控制组件只能添加到表单中,请使用FooComponent传递表单的构造函数,并且不要定义默认构造函数。它的名字是这样的:
FooComponent component = new FooComponent(this);
Run Code Online (Sandbox Code Playgroud)
组件是从表单本身内部创建的。通过不定义默认构造函数,可以:
FooComponent component = new FooComponent();
Run Code Online (Sandbox Code Playgroud)
不会编译。
(2) 公开FooComponent表单本身的属性,并在 的构造函数中FooComponent,将传递的表单设置FooComponent为this。
(3) 同样的事情,在 的构造函数中FooComponent,注册您传递的表单的关闭事件
把它们放在一起,你会得到:
public class MyForm : Form {
public FooComponent OwnedComponent { get; set; }
}
public class FooComponent {
public FooComponent (MyForm OwnerForm) {
OwnerForm.OwnedComponent = this;
OwnerForm.FormClosing += MyCallback;
}
private void MyCallback(object sender, FormClosingEventArgs e) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
不幸的是,如果您需要默认构造函数,并且它必须是真正的表单上的拖放组件,则无法强制只在表单上创建组件,或者表单只有一个实例组件的(无论如何,不是来自组件内部)。
问题有两个:
(1) 删除组件不会将该组件添加到表单中,而是将其添加到表单的components集合中。因此,即使您可以获得父级/所有者的句柄,它也永远不会是一个表单。
(2) 正如 Neil 指出的,将组件拖放到表单上会调用默认构造函数,该构造函数不传递任何参数,当然,也不会填充组件的任何属性(例如站点或容器)。
可能有帮助:可以将组件设计为在创建时通过以下几种方式收到通知:
(1) 通过实现带有参数的构造函数IContainer。当组件被放到表单上时,生成的代码将调用此构造函数。但是,它只会在运行时执行此操作,而不是设计时执行此操作。但容器将是表单components集合的句柄。
public FooComponent(IContainer container) {...}
Run Code Online (Sandbox Code Playgroud)
(2) 通过实施ISupportInitialize. 当组件被放到表单上时,生成的代码将另外调用BeginInit()和EndInit()。在 中,您可以访问和 等EndInit()属性。同样,您只能在运行时而不是设计时获得此信息,并且在此处引发异常不会阻止组件的创建。SiteContainer
Michael Weinhardt 和 Chris Sells 撰写的《MSDN 杂志》中有关组件和控件的古老但优秀的文章。
2003 年 4 月 构建具有丰富设计时功能的 Windows 窗体控件和组件
2003 年 5 月 构建具有丰富设计时功能的 Windows 窗体控件和组件,第 2 部分
这些现在是 .chm 帮助文件。您需要在文件的属性页中取消阻止才能在下载后读取内容。
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |