using System.Drawing; namespace System.Windows.Forms { public class Panel : ContainerControl { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (BorderStyle != BorderStyle.None) this.DrawVisualStyleBorder(e.Graphics, new Rectangle(0, 0, Width - 1, Height - 1)); } } public class PanelBase : ContainerControl { protected System.Windows.Controls.ContentControl contentControl; protected System.Windows.Controls.Panel panel; public double MaxWidth { get => control.MaxWidth; set => control.MaxWidth = value; } public Windows.HorizontalAlignment HorizontalAlignment { get => control.HorizontalAlignment; set => control.HorizontalAlignment = value; } public Windows.VerticalAlignment VerticalAlignment { get => control.VerticalAlignment; set => control.VerticalAlignment = value; } protected void SetPanel(System.Windows.Controls.Panel panel) { contentControl = new System.Windows.Controls.ContentControl(); this.panel = panel; SetContentControl(contentControl, contentControl, panel); HorizontalAlignment = Windows.HorizontalAlignment.Stretch; VerticalAlignment = VerticalAlignment.Stretch; panel.ClearValue(FrameworkElement.FlowDirectionProperty); } internal override void AddChild(Control child) { var c = child.control; c.Margin = new System.Windows.Thickness(c.Margin.Left + Margin.Left, c.Margin.Top + Margin.Top, c.Margin.Right + Margin.Right, c.Margin.Bottom + Margin.Bottom); panel.Children.Add(c); } internal override void RemoveChild(Control child) { panel.Children.Remove(child.control); } internal override void SetChildIndex(Control child, int index) { panel.Children.Insert(index, child.control); } protected override void SetControlWidth(int value) { } protected override void SetControlHeight(int value) { } protected override void SetControlLeft(int value) { } protected override void SetControlTop(int value) { } } // light version of Panel which is also based on Grid, but w/o owner draw control public class GridPanel : PanelBase { public GridPanel() { SetPanel(new System.Windows.Controls.Grid()); } } public class StackedPanel : PanelBase { private System.Windows.Controls.StackPanel stackPanel; public bool Vertical { get => stackPanel.Orientation == Windows.Controls.Orientation.Vertical; set => stackPanel.Orientation = value ? Windows.Controls.Orientation.Vertical : Windows.Controls.Orientation.Horizontal; } public StackedPanel() { stackPanel = new System.Windows.Controls.StackPanel(); SetPanel(stackPanel); } } public class WrappedPanel : PanelBase { private System.Windows.Controls.WrapPanel wrapPanel; public WrappedPanel() { wrapPanel = new System.Windows.Controls.WrapPanel(); SetPanel(wrapPanel); } } public class DockedPanel : PanelBase { private System.Windows.Controls.DockPanel dockPanel; public DockStyle DockStyle { get; set; } internal override void AddChild(Control child) { base.AddChild(child); if (DockStyle == DockStyle.Top) System.Windows.Controls.DockPanel.SetDock(child.control, Windows.Controls.Dock.Top); else if (DockStyle == DockStyle.Bottom) System.Windows.Controls.DockPanel.SetDock(child.control, Windows.Controls.Dock.Bottom); else if (DockStyle == DockStyle.Left) System.Windows.Controls.DockPanel.SetDock(child.control, Windows.Controls.Dock.Left); else if (DockStyle == DockStyle.Right) System.Windows.Controls.DockPanel.SetDock(child.control, Windows.Controls.Dock.Right); } public DockedPanel() { dockPanel = new System.Windows.Controls.DockPanel(); dockPanel.LastChildFill = true; SetPanel(dockPanel); } } }