我基本上需要做同样的事情: 获取组件的父表单
但是在紧凑的框架中没有定义
IDesignerHost
知道怎么做吗?
编辑:它是System.ComponentModel.Component
我想放弃一些System.Windows.Forms.Container
控制的派生组件。我需要参考这个的原因是我不想在我将组件放置到的每个表单中为我的组件手动设置父容器。
我基本上需要做同样的事情: 获取组件的父表单
但是在紧凑的框架中没有定义
IDesignerHost
知道怎么做吗?
编辑:它是System.ComponentModel.Component
我想放弃一些System.Windows.Forms.Container
控制的派生组件。我需要参考这个的原因是我不想在我将组件放置到的每个表单中为我的组件手动设置父容器。
在 Compact Framework 中,Form 的组件包含在成员 Container 变量中。除了 Form 创建了实例之外,该 Container 和 Form 本身之间没有直接关系。就此而言,该实例可以很容易地传递给其他一些 Form 或非 Form 类,以及原始父 Disposed。
这意味着没有办法确定组件的“包含表单”。该信息根本不存储在任何地方(GC 可以看到根,但这有点不同,无论如何都不可查询)。
现在,如果您只想要对 IContainer 的引用,而不是将实例保存到 IContainer 的 Form,您可以 query component.Site.Container
,但即使这样也有很多潜在的漏洞。
例如,如果您将 SerialPort 组件拖放到表单上,则设计器会将其添加到组件集合中并serialPort.Site.Container
进行设置。但是,如果将 Timer 组件拖放到 Form 上,则不会将 Timer添加到 Components 集合中,timer.Site
实际上null
也是如此,因此即使尝试查询 Container 也会抛出 NullReferenceException。
为了让它更有趣,像 SerialPort 这样的组件还具有允许在没有 IContainer 的情况下创建的构造函数,因此在设计器中将 SerialPort 拖放到 Form 时会将其添加到 Form 的组件中,如果开发人员手动创建 SerialPort,这是非常罕见的它将被添加到组件集合中。
基本上,我认为您需要重新考虑您的预期架构。你必须想出一些不依赖于父容器的机制。