|
分類:[C#]
初めて質問いたします、よろしくお願いします。
ToolStripContainerのように四方を折り畳み可能なコンテナにした FormPaneContainerというContainerControlを作成しています。
Left/Top/Bottom/Right/ContentというContainerControlを子にします。 挙動そのものは問題ないのですが、Windows フォーム デザイナが作成する コードに問題があるのです。
本来は作成してほしくない Controls.Add が追加されてしまうのです。
// // コントロールライブラリ側 // [Docking(DockingBehavior.AutoDock)] [Designer(typeof(Suikyo.Forms.Design.FormPaneContainerDesigner))] public class FormPaneContainer : ContainerControl { private FormSidePane m_bottomPane; private FormSidePane m_leftPane; private FormSidePane m_rightPane; private FormSidePane m_topPane; private FormContentPane m_contentPane = null;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public FormSidePane LeftPane { get { return this.m_leftPane; } }
private void InitializeComponent() { this.SuspendLayout();
this.m_bottomPane = new FormSidePane(this, DockStyle.Bottom); this.m_contentPane = new FormContentPane(this); this.m_leftPane = new FormSidePane(this, DockStyle.Left); this.m_rightPane = new FormSidePane(this, DockStyle.Right); this.m_topPane = new FormSidePane(this, DockStyle.Top);
this.Controls.Add(this.m_bottomPane); this.Controls.Add(this.m_contentPane); this.Controls.Add(this.m_leftPane); this.Controls.Add(this.m_rightPane); this.Controls.Add(this.m_topPane);
this.ResumeLayout(); } }
とし、new FormPaneContainer()時に暗黙的に子コンテナを追加します。
ホストプロジェクトでFormPaneContainerを追加し、作成されたコードを見てみると、
namespace Host { partial class Form1 { private void InitializeComponent() { this.formPaneContainer1 = new FormPaneContainer(); // ・・・ // this.formPaneContainer1.LeftPane.AllowDrop = true; this.formPaneContainer1.LeftPane.Name = "TopPane"; this.formPaneContainer1.LeftPane.TabIndex = 4; // // 問題の箇所 // this.formPaneContainer1.Controls.Add(this.formPaneContainer1.LeftPane); // ・・・ // } } }
となり、同じインスタンスを2回も追加しています。
自身で調べてみた限り、同じような挙動をする SplitContainer の内部では this.Controls.Add を使っておらず、ReadOnlyControllCollectionなるものに追加していました。
子コンテナをコンポーネント化する以外の方法で、 これを解決する方法はないものでしょうか?
|