c# - 更改 ComboBox 边框轮廓颜色
问题描述
我正在尝试管理 ComboBox 的颜色。虽然可以更改背景颜色,但我找不到边框轮廓的属性。
由于箭头,在深色主题中仅绘制一个正方形作为边框是行不通的。这让我得出结论,这个边框可能是一个实际的图像文件。
有可能替换这个吗?
更新: 我已经实施了@AhmedAbdelhameed 的解决方案 - 现在看起来好多了。但是对于平面样式,我必须调整矩形,如下所示:
using (var p = new Pen(this.BorderColor, 1))
{
g.DrawRectangle(p, 0, 0, Width - buttonWidth - 1, Height - 1);
}
我还交换了“BorderColor”以匹配我的 UI 的其余部分:
public CustomComboBox()
{
BorderColor = Color.Gray;
}
我现在想要做的是仅在深色主题中更改实际的下拉按钮(可能带有覆盖 png)
更新: 我已经能够使用以下代码向自定义控件添加一个pricturebox:
using (var g = Graphics.FromHwnd(Handle))
{
using (var p = new Pen(this.BorderColor, 1))
{
g.DrawRectangle(p, 0, 0, Width - buttonWidth - 1, Height - 1);
}
if (Properties.Settings.Default.Theme == "Dark")
{
g.DrawImageUnscaled(Properties.Resources.dropdown, new Point(Width - buttonWidth - 1));
}
}
看起来棒极了!或多或少是巧合,我不明白,当我在主题组合框中更改主题时,黑暗的下拉按钮甚至消失了。
解决方案
在这个答案的帮助下,我能够想出以下内容:
首先,将以下内容添加到您的表单中以避免闪烁:
protected override CreateParams CreateParams
{
get
{
CreateParams handleParam = base.CreateParams;
handleParam.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
return handleParam;
}
}
现在,将以下类添加到您的项目中:
public class CustomComboBox : ComboBox
{
private const int WM_PAINT = 0xF;
private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_PAINT)
{
using (var g = Graphics.FromHwnd(Handle))
{
// Uncomment this if you don't want the "highlight border".
/*
using (var p = new Pen(this.BorderColor, 1))
{
g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
}*/
using (var p = new Pen(this.BorderColor, 2))
{
g.DrawRectangle(p, 2, 2, Width - buttonWidth - 4, Height - 4);
}
}
}
}
public CustomComboBox()
{
BorderColor = Color.DimGray;
}
[Browsable(true)]
[Category("Appearance")]
[DefaultValue(typeof(Color), "DimGray")]
public Color BorderColor { get; set; }
}
重建项目,用新的 替换 ComboBox 控件CustomComboBox
,将BorderColor
属性设置为您选择的颜色,一切顺利。
结果:
更新:
使用以下值似乎可以提供更好的结果(特别是在单击下拉按钮时),但您可能仍然需要绘制第一个矩形(上面评论的那个)以避免仅在按钮周围显示“突出显示边框”:
using (var p = new Pen(this.BorderColor, 3))
{
g.DrawRectangle(p, 1, 1, Width - buttonWidth - 3, Height - 3);
}
推荐阅读
- jquery - 我想拆分一个对象并传递给我的 POJO setter
- regex - 正则表达式:如何替换 xml 属性中的所有嵌套双引号
- java - 不要在 JAVA 中从字符串的开头/结尾修剪制表符(\t)
- ansible - 如何查看托管主机上的文件?
- plsql - 为奇怪的符号获取正确的十六进制
- visual-studio-code - 对 .tsx/.ts 文件中的 css 类名禁用智能感知
- c++ - 将函数对象分配给函数包装器后的意外行为
- firebase-realtime-database - 使用 Firebase 规则防止空数据库路径
- swift - 将 Moya 响应错误转换为定义的类型
- apache-spark - PSQLException:错误:“WITH”处或附近的语法错误