Splitter

SplitterはSplitContainerで置き換えられており、以前のバージョンの互換性のためだけに提供されています。Definition - Splitter Class (System.Windows.Forms) | Microsoft Learn

プロパティ

プロパティ 内容 既定値
DockStyle Dock 親コントロールにドッキングする境界 DockStyle.Left
int SplitPosition Splitterにより分割されたコントロールの幅。コントロールにバインドしていなければ-1

コントロールのサイズを変更すると、このプロパティの値も変更される

 
int MinSize Splitterにより分割されたコントロールの最小幅

左右に分割しているときは、左側のコントロールの最小の幅

25
int MinExtra MinSizeの反対側の最小幅 25
int Width Splitterの幅 3
プロパティ - Splitter クラス (System.Windows.Forms) | MSDN

MinExtra

Splitterによってサイズが変更されるコントロールは、その親コントロールのサイズからMinExtraを減じたサイズを超えられません。CalcSplitBounds - CalcSplitBounds

ですのでMinExtraに負数を設定できればこのサイズを拡大できるのですが、負数を指定すると0に設定されてしまいます。MinExtra - Splitter.cs

よってこのMinExtraプロパティによって設定されるminExtraフィールドを、直接書き換えるようにします。c# - How to resize controls seperated by a splitter beyond their container panel size? - Stack Overflow

typeof(Splitter).GetField("minExtra", BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(splitter, Int32.MinValue / 2);

イベント

イベント 発生タイミング
SplitterEventHandler SplitterMoving Splitterが移動の処理をしているとき
SplitterEventHandler SplitterMoved Splitterが移動したとき
     

サンプルコード

// Splitterからタブオーダーの前方へたどることで、それが適用されるコントロールを得られる
Control c = splitter.Parent.GetNextControl(splitter, true);
object.ReferenceEquals(c, panel1);

2分割

Panel panel1 = new Panel();
Panel panel2 = new Panel();
Splitter splitter = new Splitter();

panel1.Dock   = DockStyle.Left;
splitter.Dock = DockStyle.Left; // 適用するコントロールのDockStyleと同一の値を指定
panel2.Dock   = DockStyle.Fill; // 親コントロールに合わせてサイズを変化させるコントロールをFillとする

this.Controls.Add(panel2);
this.Controls.Add(splitter); // 適用するコントロール (panel1) の直前に追加する
this.Controls.Add(panel1);

パネルはZオーダーに従い配置されるため、親コントロールへの追加の順が重要となります。

3分割

横にパネルを3つ並べる場合を考えます。

panel1とpanel2の境界を右に移動するときの制限は、MinExtraに負数を設定することで拡大できます。

右のパネルが基準

親コントロールのサイズを変更したとき、右のパネルのサイズが変化します。

Panel panel1 = new Panel();
Panel panel2 = new Panel();
Panel panel3 = new Panel();
Splitter splitter1 = new Splitter();
Splitter splitter2 = new Splitter();

panel1.Dock    = DockStyle.Left;
splitter1.Dock = DockStyle.Left;
panel2.Dock    = DockStyle.Left;
splitter2.Dock = DockStyle.Left;
panel3.Dock    = DockStyle.Fill; // 親コントロールに合わせてサイズを変化させるコントロール

this.Controls.Add(panel3);
this.Controls.Add(splitter2); // 適用するコントロール (panel2) の直前に追加する
this.Controls.Add(panel2);
this.Controls.Add(splitter1);
this.Controls.Add(panel1);

中央のパネルが基準

親コントロールのサイズを変更したとき、中央のパネルのサイズが変化します。

Panel panel1 = new Panel();
Panel panel2 = new Panel();
Panel panel3 = new Panel();
Splitter splitter1 = new Splitter();
Splitter splitter2 = new Splitter();

panel1.Dock    = DockStyle.Left;
splitter1.Dock = DockStyle.Left;
panel2.Dock    = DockStyle.Fill; // 親コントロールに合わせてサイズを変化させるコントロール
splitter2.Dock = DockStyle.Right;
panel3.Dock    = DockStyle.Right;

this.Controls.Add(panel2);
this.Controls.Add(splitter2); // 適用するコントロール (panel3) の直前に追加する
this.Controls.Add(panel3);
this.Controls.Add(splitter1);
this.Controls.Add(panel1);

上下と左右分割の組み合わせ

Panel panel1 = new Panel();
Panel panel2 = new Panel();
Panel panel3 = new Panel();
Splitter splitter1 = new Splitter();
Splitter splitter2 = new Splitter();

panel1.Dock    = DockStyle.Left;
splitter1.Dock = DockStyle.Left;
panel2.Dock    = DockStyle.Top;
splitter2.Dock = DockStyle.Top;
panel3.Dock    = DockStyle.Fill;

this.Controls.Add(panel3);
this.Controls.Add(splitter2);
this.Controls.Add(panel2);
this.Controls.Add(splitter1);
this.Controls.Add(panel1);

タブオーダー

複数のコントロールを同一の境界にドッキングさせると、見た目の順とタブオーダーが一致しなくなることがあります。その場合にはTabIndexを明示的に設定し直します

Panel panel1 = new Panel();
Panel panel2 = new Panel();
Panel panel3 = new Panel();

Splitter splitter1 = new Splitter();
Splitter splitter2 = new Splitter();

panel1.Dock = DockStyle.Left;
panel2.Dock = DockStyle.Left;
panel3.Dock = DockStyle.Left;

this.Controls.Add(panel3); // TabIndex: 0
this.Controls.Add(splitter2);
this.Controls.Add(panel2); // TabIndex: 2
this.Controls.Add(splitter1);
this.Controls.Add(panel1); // TabIndex: 4

panel1.TabIndex = 0;
panel2.TabIndex = 1;
panel3.TabIndex = 2;
Microsoft Learnから検索