对继承表单的控件是否被锁定,是否可以撤消?

时间:2014-03-04 20:09:12

标签: c# winforms visual-inheritance

设定:

我创建了一个Form,我希望将其作为我将继承其他表单的基础。此基本表单用作"模板"但是它还提供了与结构相关的大量功能,以及所提供的所有控件的相互关系。

以下图片的底漆...顶部信息色条是继承自ToolStrip的自定义控件。底部条带是另一个自定义,再次继承自ToolStrip。左边的白色块是TreeView,右边的块是TabControl(从中删除了所有TabPages ...我打算将这些块添加到继承的表单中。 / p>

设计师基本形式的图片:

enter image description here

设计师中继承表单的图片:

enter image description here

显然,唯一的区别是当我打开继承的表单时,我会在每个控件上叠加一个小盒子图标,当我点击它们时,我会看到挂锁告诉我无法编辑。

问题:

继承表单上的所有控件都被锁定。我已经研究了visual inheritance的问题,据我所知,我没有使用明确不支持它的任何控件,正如this link所暗示的那样。在this Q&A中,Hans建议更改这些控件的修饰符,我已经完成了。事实上,我同时尝试了PublicProtected,但都没有取得好成绩。

我很难过。

1 个答案:

答案 0 :(得分:3)

这是设计器中的技术限制,它特定于您正在使用的SplitContainer控件。还有其他一些。麻烦制造者是ISupportInitialize接口。

当控件无法承受以任意顺序分配的控件属性时,控件使用此接口。设计人员在看到控件实现此接口时会有所帮助,它在开始分配属性时调用BeginInit()方法,EndInit()在完成时调用。控件使用这些方法来延迟属性赋值的副作用,EndInit()方法使它们有效。对SplitContainer很重要,面板的最小尺寸也会影响分割器的位置。

也许你可以看到rub,基础表单类中的InitializeComponent()方法已经调用了ISupportInitialize.EndInit()。因此,在派生的表单类中再次修改属性不太可能。设计者通过锁定它来保护控件。

非常不方便,没有简单的解决方法。如果在派生的表单类中修改SplitContainer是一项硬性要求,那么您将不得不放弃继承它或在派生类构造函数中手动编写代码。