我希望能够在我的一些工具条中更改ToolStripComboBox控件的边框颜色,因为与平面样式一起使用时ComboBoxes的默认边框颜色是SystemColors.Window,它基本上对默认控件颜色不可见工具条。在Reflector中进行了大量的挖掘后,我没有看到任何明显的方法,因为ComboBox渲染背后的所有基础设施都受到内部和私有接口的高度保护。
在ToolStrips之外,我见过用于修复ComboBox上边框颜色的常用解决方案是子类化ComboBox,覆盖WndProc,并手动绘制边框。这对于ToolStripComboBox控件不起作用,因为内部ComboBox控件是它自己的ComboBox私有子类,我无法看到替换控件的实例。
我正在考虑的替代解决方案是将一个扩展的ComboBox对象放入ToolStripControlHost中,这允许我绘制边框,但是我必须放弃一些专业的渲染器调整。我注意到的第二个缺点是在鼠标悬停期间偶尔会出现闪烁。
将我的设计转换为WPF不是一个可接受的解决方案。用于绘制边框的父控件中的包装控件也是不可接受的,因为这对ToolStripControlHost替代方案没有任何好处。
有没有人有一个聪明的解决方案来解决这个问题,或者是否存在现有的(允许许可的)ComboBox平面式渲染堆栈的重新实现,这解决了现有实现中的一些缺点?
答案 0 :(得分:3)
这是一种让它起作用的方法......有点:)
为Paint的ToolStrip事件创建事件处理程序。然后循环遍历所有ToolStripComboBoxes并在它们周围绘制一个矩形。
private Color cbBorderColor = Color.Gray;
private Pen cbBorderPen = new Pen(SystemColors.Window);
private void toolStrip1_Paint(object sender, PaintEventArgs e)
{
foreach (ToolStripComboBox cb in toolStrip1.Items)
{
Rectangle r = new Rectangle(
cb.ComboBox.Location.X - 1,
cb.ComboBox.Location.Y - 1,
cb.ComboBox.Size.Width + 1,
cb.ComboBox.Size.Height + 1);
cbBorderPen.Color = cbBorderColor;
e.Graphics.DrawRectangle(cbBorderPen, r);
}
}
这是它的样子(请注意,您可能需要调整ToolStrip的高度以防止被绘制的边框被切断):
答案 1 :(得分:1)
<强>改善强>: 检查工具条项的类型, 因此,如果它是toolstipLabel,程序不会粉碎。
foreach (var item in toolStrip1.Items)
{
var asComboBox = item as ToolStripComboBox;
if (asComboBox != null)
{
var location = asComboBox.ComboBox.Location;
var size = asComboBox.ComboBox.Size;
Pen cbBorderPen = new Pen(Color.Gray);
Rectangle rect = new Rectangle(
location.X - 1,
location.Y - 1,
size.Width + 1,
size.Height + 1);
e.Graphics.DrawRectangle(cbBorderPen, rect);
}
}
答案 2 :(得分:0)
toolStrip1.ComboBox.FlatStyle = FlatStyle.System;
这将在组合框周围设置默认的操作系统样式边框。在Windows 10上,它是浅灰色和薄边框。尽管根据背景,可能不会显示。在这种情况下,您可以尝试使用其他选项,例如FlatStyle.Popup
。
如果预设不是您想要的预设,则其他答案可让您绘制自定义边框。但是,由于在组合框周围以+1像素大小绘制了矩形,因此边框比组合框大1像素。删除+1和-1也不起作用。