更改Winforms菜单下拉列表的边框颜色

是否可以更改工具条菜单下拉列表的边框颜色。

在下面的示例中,我希望下拉菜单有1种颜色(蓝色),而当前没有白色边框被移位,但保持主菜单(“我的菜单”)项目为白色。

有任何想法吗?

在此处输入图像描述

Is it possible to change the border color of a toolstrip menu dropdown list.

是。 从ProfessionalColorTableinheritance的类按预期工作:

 class MenuColorTable : ProfessionalColorTable { public MenuColorTable() { // see notes base.UseSystemColors = false; } public override System.Drawing.Color MenuBorder { get{return Color.Fuchsia;} } public override System.Drawing.Color MenuItemBorder { get{return Color.DarkViolet;} } public override Color MenuItemSelected { get { return Color.Cornsilk;} } public override Color MenuItemSelectedGradientBegin { get{return Color.LawnGreen;} } public override Color MenuItemSelectedGradientEnd { get { return Color.MediumSeaGreen; } } public override Color MenuStripGradientBegin { get { return Color.AliceBlue; } } public override Color MenuStripGradientEnd { get { return Color.DodgerBlue; } } } 

在表单加载中:

 menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MenuColorTable()); 

如果未打开视觉样式,则不会使用所有颜色表项,而是使用某些SystemColors 。 您在Main()启用视觉样式:

 // must be done before any UI elements are used Application.EnableVisualStyles(); 

您可能还想要禁用系统颜色,如ctor中所示。 无论视觉样式是否启用,默认值都应为false,但是可能还有其他一些改变了吗?

 base.UseSystemColors = false; 

EnableVisualStyles()UseSystemColors = false; 必须使用颜色表中的所有渲染元素来实现,否则只使用一些。 (尽管如此, MenuBorderMenuBorder似乎都能正常工作。)否则,结果如预期:

在此处输入图像描述

菜单渐变从AliceBlue到DodgerBlue; 将鼠标hover在它上面的项目使用LawnGreen到MediumSeaGreen的从上到下的渐变(鼠标未显示)。

在此处输入图像描述

打开时,菜单边框是Fuschia(mmmm,舒缓!)

在此处输入图像描述

将鼠标hover在其中一个项目上(鼠标未显示),该项目使用MenuItemSelected颜色,即Consilk。

如果您在覆盖工作时遇到问题,请检查您是否正在使用正确的覆盖(或者他们的意思是名称所暗示的,有些人首先会误导)。

您可能还会检查您是否正在使用菜单的MenuStrip ,Net确实有另一个(较旧的)菜单类,但您必须搜索才能找到它。 您还可以更改或禁用任何主题,以查看是否可能导致不利影响。

要更改边框颜色,只需遵循已接受答案中描述的Plutonix解决方案即可。 但要删除项目和菜单边框之间的白色边框,您应该遵循以下解决方案之一:

解决方案1


您可以通过实现inheritanceProfessionalColorTable并覆盖正确属性的自定义颜色表来实现。 为此,请按照下列步骤操作:

脚步

  1. 在表单上放置一个ToolStrip并将DropDownButton及其子项添加到其中,并将子项的ForeColor设置为White。
  2. 创建CustomColorTable类inheritance自ProfessionalColorTable
  3. 覆盖ImageMarginGradientBegin,ImageMarginGradientMiddle,ImageMarginGradientEnd,ToolStripDropDownBackground并返回所需的颜色(蓝色).from
  4. 在您的表单加载事件中,将ToolStripManager的 Renderer属性设置为使用使用CustomColorTable的ToolStripProfessionalRenderer。

CustomColorTable代码

 public class CustomColorTable:ProfessionalColorTable { public override Color ImageMarginGradientBegin { get { return Color.MidnightBlue; } } public override Color ImageMarginGradientMiddle { get { return Color.MidnightBlue; } } public override Color ImageMarginGradientEnd { get { return Color.MidnightBlue; } } public override Color ToolStripDropDownBackground { get { return Color.MidnightBlue; } } } 

表格加载代码

 private void Form_Load(object sender, EventArgs e) { ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable()); } 

截图

这是正常的截图

在此处输入图像描述

这是一个2倍放大的截图:

在此处输入图像描述

解决方案2


如果您不想在菜单项中使用图像,还可以使用其他解决方案。 在这种情况下,找到dropdown按钮的DropDown属性并将其强制转换为ToolStripDropDownMenu,然后将其ShowImageMargin属性设置为false,并将其BackColor设置为所需的颜色(蓝色)。

 private void Form_Load(object sender, EventArgs e) { //The item with text "My Menu" in your sample var dropDownMenu = (ToolStripDropDownMenu)this.myMenuToolStripDropDownButton1.DropDown; dropDownMenu.ShowImageMargin = false; dropDownMenu.BackColor = Color.Navy; } 

在此处输入图像描述

我现在无法制作演示应用程序,但是本文中的截图http://www.vbforums.com/showthread.php?596563-100-Customizable-MenuStrip-ToolStrip-StatusStrip-including-common-presetscertificate了我们可以改变边框颜色。

那家伙开发了一些库,但它基于标准的ToolStrip实现。

我希望这个链接会有所帮助。

您可以为项目提供负边距以覆盖边框。