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

10

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

在我的示例中,我希望下拉菜单具有一个颜色(蓝色),而不是当前显示的白色边框,但保留主菜单(“我的菜单”)项为白色。

有什么想法吗?

输入图像描述


你是否在寻找这个问题:https://dev59.com/OWrWa4cB1Zd3GeqP_Xl9? - Andrii Shvydkyi
嗯,这可能是一个重复的问题。但我仍然不知道要覆盖哪个属性才能获得所需的效果。我已经尝试了MenuItemBorder和MenuBorder,但并没有改变。 - Cameron Castillo
1
要更改边框颜色,只需按照@Plutonix的解决方案即可,该解决方案在被接受的答案中有描述。但是,如果要删除项目和菜单边框之间的白色边框,请考虑采用我所描述的其中一种解决方案。 - Reza Aghaei
谢谢。 为记录起见:Reza的解决方案也可以使用。 - Cameron Castillo
4个回答

14

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

是的。继承自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似乎始终有效。)否则,结果将如预期所示:

enter image description here

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

enter image description here

打开菜单时,菜单边框为Fuschia(嗯嗯,很舒缓!)

enter image description here

当鼠标悬停在其中一个项目上(未显示鼠标),该项目使用了MenuItemSelected颜色,它是Consilk。

如果您无法使覆盖生效,请检查是否使用了正确的重载(或者它们是否具有所暗示的含义,有些一开始可能会引导入歧途)。

您还可以检查是否使用了MenuStrip菜单,.Net确实有另一个(更旧的)菜单类,但必须进行搜索才能找到。您还可以更改或禁用任何主题,以查看是否会产生不良影响。


谢谢 - 这是一个好答案。有没有想法可以覆盖重写哪个方法来更改所选菜单项(顶部菜单,而不是下拉菜单)的字体颜色? - Cameron Castillo
这不是一个标准属性吗?menuStrip1.BackColor似乎只改变了顶部/主菜单文本。此外,如果您想要同步一些更改以模拟Glow效果,还有MouseEnter/MouseLeave事件。不过,那可能会很繁琐。 - Ňɏssa Pøngjǣrdenlarp

6
要更改边框颜色,只需按照 Plutonix 解决方案所述的步骤即可。但是,要删除项目和菜单边框之间的白色边框,您应该遵循以下解决方案之一:

Solution 1


您可以通过实现继承ProfessionalColorTable并覆盖正确属性的自定义颜色表来完成。为此,请执行以下步骤:

步骤

  1. 将 ToolStrip 放置在窗体上,并向其中添加 DropDownButton 及其子项,并将子项的 ForeColor 设置为白色。
  2. 创建一个 Inheriting fromProfessionalColorTable 的 CustomColorTable 类
  3. 覆盖 ImageMarginGradientBegin、ImageMarginGradientMiddle、ImageMarginGradientEnd、ToolStripDropDownBackground 并返回您想要的颜色(蓝色)。
  4. 在您的 Form Load 事件中,将 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());
}

截图

这是普通截图:

enter image description here

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

enter image description here

解决方案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;
}

enter image description here


谢谢你的回答。这也是一个很好的答案,但我先看到下面的答案并完成了整个实现。遗憾的是我只能接受一个答案。 - Cameron Castillo

0

不确定我是否遗漏了什么,但是这些屏幕截图中的边框仍然是白色的(下拉菜单)。 - Cameron Castillo
这个窗口:http://i48.tinypic.com/2mzjfva.jpg 有深红色的边框。一些额外的白色边框是由背景引起的。 - Andrii Shvydkyi
我指的是额外的白色边框。在我的屏幕截图中,我还将背景颜色改成了不同的颜色(根据您提供的屏幕截图)。但两者都有那个小有趣的白色边框。 - Cameron Castillo

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接