いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DevExpress奮闘記-015 XtraTabbedMdiManager


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); } } ///

/// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.tabbedMdiManager1 = new Gsf.Lib.Controls.TabbedMdiManager(this.components); ((System.ComponentModel.ISupportInitialize)(this.tabbedMdiManager1

*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