c# – .NET(非可视)组件
我需要创建一个非可视组件FooComponent,它将对驻留在其表单中的Bar类型的所有控件进行一些管理.
我有以下约束: > FooComponent只能添加到表单中. 上面的#1和#2应该在运行时和设计时强制执行. 我在Google和MSDN上搜索了一些帮助,并阅读了有关Component和ComponentDesigner类的内容,但是我找不到任何有关救援的信息. 我该怎么办? 解决方法
(1)要控制组件只能添加到表单中,请使用传递表单的FooComponent构造函数,而不要定义默认构造函数.它被称为:
FooComponent component = new FooComponent(this); 从表单本身创建组件的位置.通过不定义默认构造函数,这个: FooComponent component = new FooComponent(); 不会编译. (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) { ... } } 编辑 问题是双重的: (2)正如Neil指出的那样,将一个组件放到一个表单上会调用默认的构造函数,该构造函数不传递任何参数,当然,也不会填充组件的所有属性(例如站点或容器). 可能有用:组件可以设计为在以几种方式创建时得到通知: (1)通过实现一个带有IContainer参数的构造函数.当组件被放在表单上时,生成的代码将调用此构造函数.但是,它只会在运行时执行此操作,而不是设计时.但容器将是表单组件集合的句柄. public FooComponent(IContainer container) {...} (2)通过实现ISupportInitialize.当组件被放在表单上时,生成的代码将另外调用BeginInit()和EndInit().在EndInit()中,您可以访问诸如“站点”和“容器”之类的属性.同样,您只能在运行时获取此信息,而不是设计时间,并且在此处抛出异常不会阻止创建组件. Michael Weinhardt和Chris Sells撰写的关于组件和控制的优秀文章,来自MSDN Magazine. 这些是现在的.chm帮助文件.您需要在文件的属性页面中取消阻止才能在下载后读取内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |