gpt4 book ai didi

c# - .NET(非可视化)组件

转载 作者:太空狗 更新时间:2023-10-29 20:29:06 26 4
gpt4 key购买 nike

我需要创建一个非可视化组件 FooComponent,它将对其表单中所有 Bar 类型的控件进行一些管理。

我有以下限制:

  1. FooComponent 只能添加到表单中。
  2. 每个表单只允许一个 FooComponent
  3. FooComponent 应该注册到表单关闭事件,当它触发并注册到所有 Bar 上的某些函数并发送 e.Cancel 基于返回值的值。

上面的#1 和#2 应该在运行时和设计时强制执行。#3 事件注册应该自动进行,而不是由 FooComponent 的用户进行。

我在 Google 和 MSDN 上搜索了一些帮助,并阅读了有关 ComponentComponentDesigner 类的内容,但我没有找到任何可以挽救的东西。

我该怎么办?

最佳答案

(1) 要控制组件只能添加到表单中,请使用传递给表单的FooComponent 构造函数,不要定义默认构造函数。它被称为:

FooComponent component = new FooComponent(this);

组件是从表单本身创建的。通过不定义默认构造函数,这:

FooComponent component = new FooComponent();

不会编译。


(2) 在表单本身上暴露一个FooComponent属性,并在FooComponent的构造函数中,将传入表单的FooComponent设置为这个


(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) {
...
}

}



编辑
不幸的是,如果您需要默认构造函数,并且它必须是真正的表单组件,则无法强制组件仅在表单上创建,或者表单只有一个实例组件(不是来自组件内部,无论如何)。

问题是双重的:
(1) 删除组件不会将组件添加到表单中,而是将其添加到表单的 components 集合中。因此,即使您可以获得父/所有者的句柄,它也永远不会是表单。

(2) 正如 Neil 所指出的,将组件放到表单上会调用默认构造函数,它不传递任何参数,当然,也不会填充组件的任何属性(例如站点或容器)。


可能有帮助:可以将组件设计为在以多种方式创建时收到通知:

(1) 通过实现一个带有 IContainer 参数的构造函数。当组件被拖放到窗体上时,生成的代码将改为调用此构造函数。但是,它只会在运行时执行此操作,而不会在设计时执行。但容器将是表单的 components 集合的句柄。

public FooComponent(IContainer container) {...}

(2) 通过实现ISupportInitialize。当组件被放置在窗体上时,生成的代码将另外调用 BeginInit()EndInit()。在 EndInit() 中,您可以访问 SiteContainer 等属性。同样,您只会在运行时而不是设计时得到它,并且在此处抛出异常不会阻止组件的创建。

来自 MSDN Magazine 的有关组件和控件的旧但优秀的文章作者:Michael Weinhardt 和 Chris Sells。
April 2003 Building Windows Forms Controls and Components with Rich Design-Time Features
May 2003 Building Windows Forms Controls and Components with Rich Design-Time Features, Part 2

这些现在是 .chm 帮助文件。您需要在文件的属性页中取消阻止,才能在下载后阅读内容。

关于c# - .NET(非可视化)组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com