DevExpressには、MDIをサポートするXtraTabbedMdiManagerというコントロールが
存在します。(DevExpress.XtraBarsの中にあります。)
このコントロール、通常のWindows Formsに搭載されているMdiの機能に加えて
子のフォームをタブで表示できるというものです。
結構便利なんですが、何故かドキュメントの記述が少ないです。
さらに、このコントロール、癖がちょっとありまして、デフォルトで以下の動作をします。
デフォルト表示はタブ表示となる。タブ表示モードの場合は常に子のフォームは最大化されており 最大化以外にサイズを変更することが出来ない。
まあ、考えてみたら当たり前なんですが。
で、場合によっては通常のMDIのように子のフォームの最大化を解除してそれぞれいろいろ動かしたり
したい場合があります。(後、カスケードで並べたり、水平に並べたり・・)
その場合は以下のようにします。
xtraTabbedMdiManager.MdiParent = null;
普通のMDI状態にする場合は、明示的にMdiParentプロパティにnullを設定します。
これで、各ウィンドウは各々のサイズで表示されるようになります。
もう一度タブ表示状態にしたい場合は、再度MdiParentに親フォームの参照を設定します。
以下、サンプルです。
しかも、動作確認用の殴り書きです。読みづらいのはご愛嬌でm(_ _)m
using System; using System.Threading; using System.Windows.Forms; namespace Tmp{ public partial class XtraForm1 : DevExpress.XtraEditors.XtraForm { AutoResetEvent _are1 = new AutoResetEvent(false); AutoResetEvent _are2 = new AutoResetEvent(false); public XtraForm1() { InitializeComponent(); } private void XtraForm1_Load(object sender, EventArgs e) { for (int i = 0; i < 5; i++) { new Form { Name = string.Format("Child-{0}", i.ToString()), Text = string.Format("Child-{0}", i.ToString()), MdiParent = this }; } new MethodInvoker( () => { int i = 0; while(true){ if(i == int.MinValue) break; this.Invoke(new MethodInvoker*1; Thread.Sleep(1000); } _are1.Set(); } ).BeginInvoke*2.BeginInit(); this.SuspendLayout(); // // tabbedMdiManager1 // this.tabbedMdiManager1.ClosePageButtonShowMode = DevExpress.XtraTab.ClosePageButtonShowMode.InAllTabPagesAndTabControlHeader; this.tabbedMdiManager1.HeaderButtons = *3.EndInit(); this.ResumeLayout(false); } private TabbedMdiManager tabbedMdiManager1; }
このサンプルを実行すると、一つずつタブを追加していって追加が終わった後
一瞬通常のMDIモードになり、そのあと再びタブモードになります。
*1:) => { if (i == MdiChildren.Length){ i = int.MinValue; }else{ MdiChildren[i].Show(); i++; } }
*2:ar) => { }, null);
new MethodInvoker(
() => {
_are1.WaitOne();
Thread.Sleep(1000);
this.Invoke(
new MethodInvoker(
() => {
tabbedMdiManager1.MdiParent = null;
this.LayoutMdi(MdiLayout.TileHorizontal);
}
)
);
_are2.Set();
}
).BeginInvoke((ar) => { }, null);
new MethodInvoker(
() => {
_are2.WaitOne();
Thread.Sleep(3000);
this.Invoke(
new MethodInvoker(
() => {
tabbedMdiManager1.MdiParent = this;
}
)
);
}
).BeginInvoke((ar) => { }, null);
}
}
///
*3:DevExpress.XtraTab.TabButtons)(((DevExpress.XtraTab.TabButtons.Prev | DevExpress.XtraTab.TabButtons.Next) | DevExpress.XtraTab.TabButtons.Close))); this.tabbedMdiManager1.HeaderButtonsShowMode = DevExpress.XtraTab.TabButtonShowMode.Always; this.tabbedMdiManager1.MdiParent = this; // // XtraForm1 // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(778, 686); this.IsMdiContainer = true; this.Name = "XtraForm1"; this.Text = "XtraForm1"; this.Load += new System.EventHandler(this.XtraForm1_Load); ((System.ComponentModel.ISupportInitialize)(this.tabbedMdiManager1