我正在尝试管理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));
}
}
看起来很棒! 偶然地或多或少,我在主题组合框中更改主题时,深色的下拉按钮甚至消失了。
答案 0 :(得分:5)
在this answer的帮助下,我提出了以下建议:
首先,将以下内容添加到表单中以避免闪烁:
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; }
}
重建项目,用新的CustomComboBox
替换ComboBox控件,将BorderColor
属性设置为您选择的颜色,一切就很好了。
结果:
更新:
使用以下值似乎可以提供更好的结果(特别是在单击下拉按钮时) ,但是您可能仍需要绘制第一个矩形(上面注释的一个)以避免显示仅按钮周围的“突出显示边框”:
using (var p = new Pen(this.BorderColor, 3))
{
g.DrawRectangle(p, 1, 1, Width - buttonWidth - 3, Height - 3);
}
答案 1 :(得分:0)
要为组合框的整个宽度添加边框,您必须从图形中删除按钮的宽度。就我而言,我只是想更改边框的颜色,以便1像素就足够了。
using (var p = new Pen(this.BorderColor, 1))
{
g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
}
这意味着自定义组合框的行为与通用组合框完全相同,例如在悬停等情况下