如何更改可选面板的边框颜色



我想将所有面板的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.SelectableControlStyles.UserMouseControlStyles.StandardClick设置为truefalse,然后设置UpdateStyles((以强制使用新样式(Control从CreateParams属性检索样式(,然后调用Invalidate((本身(这会调用OnPaint方法,进而引发Paint事件(以在新状态下绘制Border。


将名为PanelEx的类添加到项目中,粘贴此处的内容(当然保留命名空间(,构建项目,在工具箱中找到新控件,并将其放在窗体上。
如果要用此控件替换所有标准面板控件,使用Visual Studio的搜索/替换功能(CTRL+H(,并用PanelEx类型替换现有的标准Panel类型对象(需要新行为的对象(。

注意-x64项目:
如果主项目需要以x64为目标,则可以将以AnyCPU为目标的新类库项目添加到解决方案中。将此自定义控件类(当然,也可以是您构建的任何其他自定义控件(添加到此库中。同时添加对System.Windows.FormsSystem.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();
}
}

相关内容

  • 没有找到相关文章

最新更新