Jus*_*dro 5 .net c# combobox toolstrip winforms
我希望能够在某些工具栏中更改ToolStripComboBox控件的边框颜色,因为与平面样式一起使用时ComboBoxes的默认边框颜色是SystemColors.Window,而对于工具栏的默认控件颜色,该颜色基本上是不可见的。在Reflector中进行了很多研究之后,我看不到任何明显的方法,因为ComboBox渲染背后的所有基础结构在内部和私有接口背后都得到了高度保护。
在ToolStrips之外,我见过的一种用于固定ComboBoxes边框颜色的常见解决方案是将ComboBox子类化,覆盖WndProc并手动绘制边框。这对于ToolStripComboBox控件不起作用,因为内部ComboBox控件是ComboBox自己的私有子类,我看不到替换控件实例的方法。
我正在考虑的另一种解决方案是将扩展的ComboBox对象之一放入ToolStripControlHost中,该工具允许我绘制边框,但是随后我不得不放弃一些专业的渲染器调整。我注意到的第二个缺点是鼠标悬停时偶尔会闪烁。
将设计切换到WPF是不可接受的解决方案。在父控件中为绘制边框包装控件也是不可接受的,因为这与ToolStripControlHost替代方法无关。
有没有人有一个聪明的解决方案来解决这个问题,或者有没有在野外对ComboBox平面样式渲染堆栈进行现有的(许可许可)重新实现,从而解决了现有实现中的一些缺点?
这是一种让它发挥作用的方法......有点:)
为ToolStrip的Paint事件创建一个事件处理程序。然后循环遍历所有ToolStripComboBox并在它们周围绘制一个矩形。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
它是这样的(请注意,您可能需要调整 ToolStrip 的高度以防止绘制的边框被切断):
