我想将所有面板的BorderColor更改为Color。Lime:
foreach (Control G in GetAllControls (this))
{
Panel p = sender as Panel;
ControlPaint.DrawBorder(e.Graphics, p.DisplayRectangle, Color.Lime, ButtonBorderStyle.Inset);
}
它显示了这个错误:
严重性代码描述项目文件行禁止显示状态错误CS1061"EventArgs"不包含"Graphics"的定义,并且找不到接受类型为"EventArg"的第一个参数的可访问扩展方法"Graphics"(是否缺少using指令或程序集引用?(
建议使用从Panel派生的自定义控件(如果需要其功能(,或者使用从Control派生的轻量级控件(如果不需要任何预定义行为(即基本控件功能除外(。
例如,Panel类的一个简单调整添加了一些允许定义的属性:
- 要分配给边框的颜色
- 边界的大小
- 选择控件时边框的颜色
- 意思是使面板可选择:当输入控件时,它将更改边框颜色,您可以将
TabStop = true
和Tab设置为突出显示等
为了使控件可选择,在设置Selectable
属性时会修改某些样式
Control调用SetStyle((并将ControlStyles.Selectable
、ControlStyles.UserMouse
和ControlStyles.StandardClick
设置为true
或false
,然后设置UpdateStyles((以强制使用新样式(Control从CreateParams属性检索样式(,然后调用Invalidate((本身(这会调用OnPaint
方法,进而引发Paint事件(以在新状态下绘制Border。
将名为PanelEx
的类添加到项目中,粘贴此处的内容(当然保留命名空间(,构建项目,在工具箱中找到新控件,并将其放在窗体上。
如果要用此控件替换所有标准面板控件,使用Visual Studio的搜索/替换功能(CTRL+H(,并用PanelEx
类型替换现有的标准Panel
类型对象(需要新行为的对象(。
注意-x64
项目:
如果主项目需要以x64
为目标,则可以将以AnyCPU
为目标的新类库项目添加到解决方案中。将此自定义控件类(当然,也可以是您构建的任何其他自定义控件(添加到此库中。同时添加对System.Windows.Forms
和System.Drawing
程序集的引用
重新生成解决方案,Visual Studio将向工具箱中添加库中的所有控件
当您从工具箱中删除窗体上的控件时,没有人会抱怨。
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
[DesignerCategory("code")]
public class PanelEx : Panel
{
private Color m_BorderColorSel = Color.Transparent;
private Color m_BorderColor = Color.Transparent;
private bool m_Selectable = false;
private bool m_Selected = false;
private int m_BorderSize = 1;
public PanelEx() { }
public Color BorderColor { get => m_BorderColor;
set {
if (value == m_BorderColor) return;
m_BorderColor = value;
Invalidate();
}
}
public int BorderSize {
get => m_BorderSize;
set {
if (value == m_BorderSize) return;
m_BorderSize = value;
Invalidate();
}
}
public bool Selectable {
get => m_Selectable;
set {
if (value == m_Selectable) return;
m_Selectable = value;
SetStyle(ControlStyles.Selectable | ControlStyles.UserMouse | ControlStyles.StandardClick, value);
UpdateStyles();
Invalidate();
}
}
public Color BorderColorSelected {
get => m_BorderColorSel;
set {
m_BorderColorSel = value;
if (!Selectable || value == m_BorderColorSel) return;
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
Color penColor = m_Selectable && m_Selected ? m_BorderColorSel : m_BorderColor;
int rectOffset = BorderSize / 2;
using (Pen pen = new Pen(penColor, BorderSize)) {
var rect = new Rectangle(rectOffset, rectOffset, ClientSize.Width - BorderSize, ClientSize.Height - BorderSize);
e.Graphics.DrawRectangle(pen, rect);
}
base.OnPaint(e);
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
OnEnter(e);
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
OnLeave(e);
}
protected override void OnEnter(EventArgs e)
{
base.OnEnter(e);
m_Selected = true;
Invalidate();
}
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
m_Selected = false;
Invalidate();
}
}