我希望能够在我的一些工具条中更改ToolStripComboBox控件的边框颜色,因为当与平面样式一起使用时,ComboBoxes的默认边框颜色是SystemColors.Window,相对于工具条的默认控件颜色,它基本上是不可见的。经过对Reflector的深入研究,我看不到任何明显的方法可以做到这一点,因为ComboBox渲染背后的所有基础设施都在内部和私有接口后面受到了高度保护。
在ToolStrips之外,我见过一种在ComboBoxes上修复边框颜色的常见解决方案,那就是创建ComboBox的子类,覆盖WndProc,然后手动绘制边框。这不适用于ToolStripComboBox控件,因为内部ComboBox控件是它自己的ComboBox的私有子类,我看不出有什么方法可以替换该控件的实例。
我正在考虑的另一个解决方案是将一个扩展的ComboBox对象放到一个ToolStripControlHost中,这样我就可以绘制一个边框,但是我不得不放弃一些专业的渲染器调整。我注意到的第二个缺点是,我在鼠标悬停时偶尔会闪烁。
将我的设计切换到WPF不是一个可接受的解决方案。在绘图边框的父控件中包装控件也是不可接受的,因为这与ToolStripControlHost替代方案相比没有任何好处。
有没有人有一个聪明的解决方案来解决这个问题,或者有没有一个现有的(许可许可的) ComboBox扁平式渲染堆栈的重新实现,它修复了现有实现中的一些缺点?
发布于 2013-12-15 04:40:04
这里有一个让它工作的方法。某种程度上:)
为ToolStrip的Paint事件创建事件处理程序。然后循环遍历所有的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的高度,以防止绘制的边框被切断):

发布于 2014-05-07 20:01:58
improvement:检查工具条项目的类型,这样如果是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);
}}
发布于 2019-06-28 04:51:31
toolStrip1.ComboBox.FlatStyle = FlatStyle.System;这将在组合框周围设置默认的OS样式的边框。在Windows10上,它是一个浅灰色的细边框。不过,根据背景的不同,它可能不会显示出来。在这种情况下,您可以尝试其他选项,如FlatStyle.Popup。
如果预设不是您要查找的内容,则其他答案允许您绘制自定义边框。但是,由于矩形是在组合框周围使用+1像素大小绘制的,因此边框比组合框大1像素。删除+1s和-1s也不起作用。
https://stackoverflow.com/questions/9560812
复制相似问题