4

设置:

我创建了一个Form我希望用作继承其他形式的基础。这种基本形式充当某种“模板”,但它也提供了大量与结构相关的功能,以及所提供的所有控件的相互关系。

以下图像的入门... 顶部信息彩色条是一个自定义控件,继承自ToolStrip. 底部条带是另一个习惯,同样继承自ToolStrip. 左边的白色块是 a TreeView,右边的块是 a TabControl(已经删除了所有TabPages...我打算将这些添加到继承的形式中)。

设计器中的基本形式的图像:

在此处输入图像描述

设计器中继承形式的图像:

在此处输入图像描述

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

问题:

继承窗体上的所有控件都被锁定。我已经研究了视觉继承的问题,据我所知,我没有使用任何明确不支持它的控件,正如这个链接所暗示的那样。在这个 Q&A中,Hans 建议更改这些控件上的修饰符,我已经这样做了。事实上,我都尝试了PublicProtected,都没有好的结果。

我难住了。

4

1 回答 1

4

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

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

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

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

于 2014-03-04T23:20:23.013 回答