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

Change the border color of Winforms menu dropdown list

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

在我下面的示例中,我希望下拉菜单有 1 种颜色(蓝色),当前没有白色边框,但主菜单 ('My Menu') 项目保持白色。

有什么想法吗?

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

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

希望这篇link对您有所帮助。

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

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

是的。继承自 ProfessionalColorTable 的 class 按预期工作:

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());

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

中启用视觉样式
// must be done before any UI elements are used
Application.EnableVisualStyles();

您可能还想禁用系统颜色,如构造函数中所示。无论是否启用视觉样式,默认值都应该是 false,但也许其他东西改变了它?

base.UseSystemColors = false;

EnableVisualStyles()UseSystemColors = false; 都必须到位才能实现 所有 颜色 table 中的渲染元素,否则只有一些被使用。 (尽管如此,MenuBorder 似乎无论如何都有效。)否则,结果如预期:

菜单渐变从AliceBlue到DodgerBlue; item 将鼠标悬停在其上使用从上到下的 LawnGreen 到 MediumSeaGreen 的渐变(鼠标未显示)。

打开时,菜单边框为紫红色(嗯,舒缓!)

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

如果您在使用覆盖时遇到问题,请检查您是否使用了正确的覆盖(或者它们的含义是否如名称所暗示的那样,有些一开始会产生误导)。

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

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

解决方案 1


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

步骤

  1. 在您的窗体上放置一个 ToolStrip 并向其添加 DropDownButton 及其子项,并将子项的 ForeColor 设置为白色。
  2. 创建 CustomColorTable class 从 ProfessionalColorTable
  3. 继承
  4. 覆盖 ImageMarginGradientBegin、ImageMarginGradientMiddle、ImageMarginGradientEnd、ToolStripDropDownBackground 和 return 你想要的颜色(蓝色)。来自
  5. 在您的 Form Load 事件中,将 Renderer 属性 设置为 ToolStripManager 以使用使用您的 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 属性 并将其转换为 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;
}