gpt4 book ai didi

c# - 继承窗体上的控件被锁定,是否可以撤消?

转载 作者:行者123 更新时间:2023-11-30 16:13:06 26 4
gpt4 key购买 nike

设置:

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

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

设计器中基本表单的图像:

enter image description here

设计器中继承表单的图像:

enter image description here

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

问题:

继承窗体上的所有控件都被锁定。我研究了visual inheritance的问题,据我所知,我没有使用任何明确不支持它的控件,如 this link建议有。在 this Q&A ,汉斯建议更改这些控件上的修饰符,我已经这样做了。事实上,我尝试了 PublicProtected,但都没有什么好结果。

我被难住了。

最佳答案

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

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

也许你可以看到摩擦,基窗体类中的 InitializeComponent() 方法已经调用了 ISupportInitialize.EndInit()。所以在派生的表单类中再次修改属性不太可能有好的结果。设计者通过锁定来保护控件不受此影响。

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

关于c# - 继承窗体上的控件被锁定,是否可以撤消?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com