序
最近有一个需求,是重绘panel边框的颜色成指定的颜色,参考了网上的一些示例代码和结合实际情况,形成了自己的解决方案,以下是实现过程。
示例代码
边框绘制类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
public static class PanelBorderPainter { private static Color _colorPanelBorder = Color.FromArgb(215, 215, 215); private static int BorderSize = 1;
public static void Paint(object sender, PaintEventArgs e) { if (sender is Control control) { #region panel颜色信息通过Tag传递
if (control.Tag != null) { if (control.Tag is Color color) { _colorPanelBorder = color; } }
#endregion
ButtonBorderStyle style = ButtonBorderStyle.Solid; ControlPaint.DrawBorder(e.Graphics, control.ClientRectangle, _colorPanelBorder, BorderSize, style, _colorPanelBorder, BorderSize, style, _colorPanelBorder, BorderSize, style, _colorPanelBorder, BorderSize, style); } } }
|
声明两个Panel
容器panelOuter包含panelInner
1 2
| private System.Windows.Forms.Panel panelOuter private System.Windows.Forms.Panel panelInner
|
关键代码
panelOuter
1 2 3 4 5
| this.panelOuter.Padding = new System.Windows.Forms.Padding(1); this.panelOuter.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelOuter.Controls.Add(panelInner);
|
panelInner
1
| this.panelInner.Dock = System.Windows.Forms.DockStyle.Fill
|
Form1构造函数
1 2 3 4 5 6
| public Form1() { InitializeComponent(); this.panelOuter.Paint += new PaintEventHandler(PanelBorderPainter.Paint); }
|
答疑
为什么需要两个Panel?
答:因为如果注释掉以下代码,水平拖拽时会出现如下的界面效果。
1
| this.panelOuter.Controls.Add(panelInner);
|
取消该行代码注释则页面拖拽效果正常。
是否必须需要两个Panel?
答:不是,内部是DataGridView等控件,其Dock=DockStyle.Fill,可以起到同样的效果。
参考资料