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によってサイズが変更されるコントロールは、その親コントロールのサイズから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);
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とする Controls.Add(panel2); Controls.Add(splitter); // 適用するコントロール (panel1) の直前に追加する Controls.Add(panel1);
パネルはZオーダーに従い配置されるため、親コントロールへの追加の順が重要となります。
横にパネルを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; // 親コントロールに合わせてサイズを変化させるコントロール Controls.Add(panel3); Controls.Add(splitter2); // 適用するコントロール (panel2) の直前に追加する Controls.Add(panel2); Controls.Add(splitter1); 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; Controls.Add(panel2); Controls.Add(splitter2); // 適用するコントロール (panel3) の直前に追加する Controls.Add(panel3); Controls.Add(splitter1); 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; Controls.Add(panel3); Controls.Add(splitter2); Controls.Add(panel2); Controls.Add(splitter1); 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; Controls.Add(panel3); // TabIndex: 0 Controls.Add(splitter2); Controls.Add(panel2); // TabIndex: 2 Controls.Add(splitter1); Controls.Add(panel1); // TabIndex: 4 panel1.TabIndex = 0; panel2.TabIndex = 1; panel3.TabIndex = 2;