Don*_*ott 5 c# visual-inheritance winforms
设置:
我创建了一个Form我希望将其作为我继承其他形式的基础。该基本表单充当某种“模板”,但它还提供了大量与结构相关的功能,以及所提供的所有控件的相互关系。
以下图像的入门...顶部的信息色栏是继承自 的自定义控件ToolStrip。底部条带是另一个定制,同样继承自ToolStrip。左边的白色块是 a TreeView,右边的块是 a TabControl(已删除TabPages其中的所有内容...我打算将它们添加到继承的表单中)。
设计器中基本表单的图像:

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

显然,唯一的区别是,当我打开继承的表单时,每个控件上都会叠加一个小框图标,当我单击它们时,我会看到挂锁,告诉我无法编辑。
问题:
继承窗体上的所有控件都被锁定。我研究了视觉继承的问题,据我所知,我没有使用任何明确不支持它的控件,正如此链接所暗示的那样。在本次问答中,汉斯建议更改这些控件的修饰符,我已经这样做了。事实上,我都尝试过,Public但Protected都没有好的结果。
我很困惑。
这是设计器中的技术限制,它特定于您正在使用的 SplitContainer 控件。还有其他一些。麻烦制造者是 ISupportInitialize 接口。
当控件无法以任意顺序分配控件的属性时,控件将使用此接口。当设计者看到控件实现此接口时,它会在开始分配属性时调用 BeginInit() 方法,在完成时调用 EndInit() 方法。控件使用这些方法来延迟属性分配的副作用,EndInit() 方法使它们有效。对于 SplitContainer 来说很重要,面板的最小尺寸也会影响拆分器的位置。
也许您可以看到问题,基本表单类中的InitializeComponent()方法已经调用了ISupportInitialize.EndInit()。因此,在派生表单类中再次修改属性不太可能有好的结果。设计者通过锁定来保护控件免受这种情况的影响。
非常不方便,没有简单的解决方法。如果修改派生表单类中的 SplitContainer 是一项硬性要求,那么您将不得不放弃继承它或在派生类构造函数中手动编写代码。