- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要创建一个非可视化组件 FooComponent
,它将对其表单中所有 Bar
类型的控件进行一些管理。
我有以下限制:
FooComponent
只能添加到表单中。FooComponent
。FooComponent
应该注册到表单关闭事件,当它触发并注册到所有 Bar
上的某些函数并发送 e.Cancel
基于返回值的值。上面的#1 和#2 应该在运行时和设计时强制执行。#3 事件注册应该自动进行,而不是由 FooComponent
的用户进行。
我在 Google 和 MSDN 上搜索了一些帮助,并阅读了有关 Component
和 ComponentDesigner
类的内容,但我没有找到任何可以挽救的东西。
我该怎么办?
最佳答案
(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()
中,您可以访问 Site
和 Container
等属性。同样,您只会在运行时而不是设计时得到它,并且在此处抛出异常不会阻止组件的创建。
来自 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/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。
目录 内置的高亮节点 自定义高亮 自定义高亮时保持原始颜色 总结 案例完整代码 通过官方文档,可知高
目录 32.go.Palette 一排放两个 33.go.Palette 基本用法 34.创建自己指向自己的连线 35.设置不同的 groupTemplate 和
目录 41.监听连线拖拽结束后的事件 42.监听画布的修改事件 43.监听节点被 del 删除后回调事件(用于实现调用接口做一些真实的删除操作) 44.监听节点鼠标
织梦初秋 那是一个宜人的初秋午后,阳光透过窗户洒在书桌上,我轻轻地拂去被阳光映照出的尘屑,伸了个懒腰。哎呀,这个世界真是奇妙啊,想到什么就能用代码实现,就像笔尖上点燃的火花。 思索的起点 我一直对天气
曲径通幽,古木参天 时光匆匆,不经意间已是2023年的秋季。我身处在这个充满朝气和变革的时代,每天都充满了新的科技突破和创新。而当我想起曾经努力学习的Python编程语言时,心中涌动着一股热情,渴望将
我有一个堆积条形图,由一个 bool 字段分割。这会导致图例显示为两种颜色(很酷!)但图例具有以下值:true 和 false。对于读者来说,什么是真或假意味着什么是没有上下文的。 在这种情况下,字段
我想在 R 中做一个简单的一阶马尔可夫链。我知道有像 MCMC 这样的包,但找不到一个以图形方式显示它的包。这甚至可能吗?如果给定一个转换矩阵和一个初始状态,那将会很好,人们可以直观地看到通过马尔可夫
我是 tableau 的新手,我有以下可视化,这是链接: My visualization 我的问题是我不知道如何在一个仪表板中添加多个仪表板作为选项卡。在我的可视化中,有三个仪表板“Nota tot
我建立类似自动VJ程序的东西。我有2个网络摄像头发出的2个incomig视频信号和一些可视化效果(目前2个,但我想要更多)。我有一个以dB为单位的传入音频信号音量,以bpm为单位。我需要的是视频输出的
我需要可视化的东西,并想要求一些提示和教程。或者使用哪种技术(Cocos2D、OpenGL、Quartz,...) 这里有人在 iOS 设备上做过可视化吗? 它是关于移动物体、褪色、粒子等等…… 任何
我对 Graphviz 越来越熟悉,想知道是否可以生成如下所示的图表/图表(不确定你叫它什么)。如果没有,有人知道什么是好的开源框架吗? (首选,C++,Java 或 Python)。 最佳答案 根据
问题很简单——我真的很喜欢用 UIStackView 来组织 UI。但是,我在测试应用程序中看不到 UIStackView 边界。当 UI 元素不是预期的时候,我需要花很多时间来调试。在网上搜索,我找
例如,我可以通过以下方式分配内存时的情况: Position* arr1 = new Position[5]; Position 是我程序中的一个类,它描述了具有 x 和 y 值的位置点。 堆栈上会有
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我最近一直在处理许多半复杂的 XSD,我想知道:有哪些更好的工具可以处理 XML 模式?有没有图形工具? 独立的或基于 Eclipse 的是理想的选择,因为我们不是 .net 商店。 最佳答案 我找到
通过一段时间的使用和学习,对G6有了更一步的经验,这篇博文主要从以下几个小功能着手介绍,文章最后会给出完整的demo代码。 目录 1. 树图的基本布局和
三维数据的获取方式 RGBD相机和深度图 代码展示:在pcl中,把点云转为深度图,并保存和可视化 三维数据的获取方式 在计算机视觉和遥感领域,点云可以通过四种主要的技术获得, (1)根据图像衍生而得,
代码 library(igraph) g <- graph.tree(n = 2 ^ 3 - 1, children = 2) node_labels <- c("", "Group A", "Gro
我正在关注 this tutorial并创建了一个这样的图表: from dask.threaded import get from operator import add dsk = { 'x
我是一名优秀的程序员,十分优秀!