10

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

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

有任何想法吗?

在此处输入图像描述

4

4 回答 4

14

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

是的。一个继承自ProfessionalColorTable预期工作的类:

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;都必须到位才能实现颜色表中的所有渲染元素,否则只使用一些。(不过,MenuBorder无论如何似乎都有效。)否则,结果如预期:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

如果您无法让您的覆盖工作,请检查您是否使用了正确的覆盖(或者它们的意思是顾名思义,有些一开始会产生误导)。

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

于 2015-09-02T15:15:00.357 回答
6

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

解决方案 1


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

脚步

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

自定义颜色表代码

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;
}

在此处输入图像描述

于 2015-09-02T17:50:55.687 回答
0

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

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

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

于 2015-08-31T12:39:34.170 回答
0

您可以给项目负边距以覆盖边框。

于 2015-09-02T13:23:37.437 回答