2014-03-04 50 views
3

設置:繼承形式的控件被鎖定,它可以撤消嗎?

我創建了一個Form,我想有作爲從中我將繼承等形式的基礎。這種基本形式可以作爲各種「模板」,但它也提供了很多與結構相關的功能,以及所提供的所有控件的相互關係。

下面的圖像的底漆...頂部的信息顏色的酒吧是從ToolStrip繼承的自定義控件。底部條是另一種自定義,從ToolStrip繼承。左邊的白色塊是TreeView,右邊的塊是TabControl(從中刪除了所有的TabPages ......我打算將這些添加到繼承的表單中)。

在設計者圖像鹼形式的:在設計者遺傳形式的

enter image description here

圖片:

enter image description here

顯然,唯一的區別是,當我打開繼承的形式,我得到一個小盒子圖標疊加在每個控件上,當我點擊它們時,我掛鎖告訴我我無法編輯。

的問題:繼承的形式

所有的控制都被鎖定。我研究了visual inheritance的問題,並且據我所知,我沒有使用任何明確不支持它的控件,因爲this link表明存在。漢斯建議在this Q&A中改變這些控制的修飾符,我已經完成了。事實上,我試過PublicProtected,都沒有好的結果。

我很難過。

回答

3

這是設計人員的技術限制,它特定於您正在使用的SplitContainer控件。還有其他一些。麻煩製造者是ISupportInitialize接口。

控件在他們無法承受以任意順序分配的控件屬性時使用此接口。設計人員在看到控件實現此接口時提供幫助,它在開始分配屬性時調用BeginInit()方法,完成時調用EndInit()。控制使用這些方法來延遲財產分配的副作用,EndInit()方法使它們有效。 SplitContainer很重要,面板的最小尺寸也會影響分光器的位置。也許你可以看到rub,基本窗體類中的InitializeComponent()方法已經調用了ISupportInitialize.EndInit()。因此,在衍生表單類中再次修改屬性不太可能。設計師通過鎖定來保護控制。

非常不方便,沒有簡單的解決方法。如果修改派生窗體類中的SplitContainer是一項艱難的需求,那麼您必須放棄繼承它或在派生類構造函數中手工編寫代碼。

+0

該底層控件實際上是一個'TableLayoutPanel'。我檢查了它的血統,我沒有在那裏看到'ISupportInitialize'。你描述的內容是否仍然適用? – DonBoitnott

+0

感嘆。不,它沒有。這是TLP的特定設計者限制,我不知道確切的問題。 –

+0

那麼這裏是權威性聲明:http://msdn.microsoft.com/en-us/library/ms171689(v=vs.90).aspx。不幸的是,不說爲什麼。感謝您的投入,Hans。 – DonBoitnott