我创建了一个继承 Panel 控件的控件类。然后该控件包含另外两个面板,其中一个我想成为 IContainerControl。
我知道如何将整个控件变成 IContainerControl,但无法对子控件执行同样的操作。我在 C# 和 VB.Net 中都尝试过,但都失败了。
这有意义吗?我尝试搜索但没有找到任何有用的东西,希望这里有人可以帮助我!
谢谢!
编辑
对不起,辛苦了一天...我正在使用 WinForms。
基本上我需要一个具有两个面板的自定义用户控件,一个显示一些统计数据,另一个包含控件。统计面板已完成并正常工作,但另一个面板可能包含 DataGridView、ListView 或 TreeView(无论用户在设计时添加哪个)。
是的,我已经实现了 ActiveControl 和 ActivateControl。
最佳答案
我认为你有两个策略:首先是“便宜的东西”:)
便宜货策略:
假设最终用户是一位拥有源代码的程序员,在 Visual Studio 或 Mono 中打开项目,能够创建用户控件,并且能够拖放他们选择的控件(例如 Treeview 或 ListView ,你提到)到“随便什么”。
一个。创建两个用户控件
UserControl1 包含两个面板的空间。
在 UserControl1 的一侧插入一个面板,并根据规范进行设计。
在 UserControl2 上:允许最终用户插入他们选择的控件:TreeView 等。
构建两个用户控件
将 UserControl2 的实例(来自工具箱图标)放置到 UserControl1 上,并根据需要放置它(Dock、Anchor 等)。
再次构建。现在您可以将 UserControl1 的实例放在 WinForm 上,它将包括两个面板。
成本/ yield :
您可以按照标准方式编辑每个控件的外观和属性
最终用户可以选择在 UserControl2 上使用哪个控件。
您在这里对组件进行了更大程度的分离,从而可以更轻松地维护或扩展?
谁来根据用户选择 TreeView 还是 ListView 来为 Control 继续 UserControl2 进行编程?
更昂贵的策略
您将需要从 'ParentControlDesigner 继承,使运行时放置的控件成为放置在另一个容器中的容器,接受设计时控件的拖放。
幸运的是,Henry Minute 在 CodeProject 上有一篇关于 C# 源代码的好文章:Designing Nested Controls强烈建议您阅读本文底部 Sacha Barber 的评论和 Henry Minute 的回答。
另见 SO:Adding design-time support for a nested container in a custom/usercontrol (Winforms).
无论采用哪种策略,您都需要做一些工作来启用访问(公开哪些属性,“引发”哪些事件以封闭容器等)。
关于c# - 使子控件成为 IContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215104/