【问题标题】:Change the border color of Winforms menu dropdown list更改 Winforms 菜单下拉列表的边框颜色
【发布时间】:2015-08-31 09:17:15
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 您是否正在寻找这个问题:stackoverflow.com/questions/13235627/…?
  • 嗯,它可能是重复的。但是我仍然不知道要覆盖什么属性才能获得预期的效果。我试过 MenuItemBorder 和 MenuBorder 但它没有改变。
  • 要更改边框颜色,遵循已接受答案中描述的@Plutonix 解决方案就足够了。但是要删除项目和菜单边框之间的白色边框,请考虑遵循我描述的解决方案之一。
  • 谢谢。郑重声明:Reza 的解决方案也可以。

标签: c# winforms toolstripmenu


【解决方案1】:

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; item 将鼠标悬停在其上时使用从上到下的 LawnGreen 到 MediumSeaGreen 渐变(鼠标未显示)。

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

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

如果您无法让您的覆盖正常工作,请检查您是否使用了正确的覆盖(或者它们的意思是否如其名称所暗示的那样,有些起初会产生误导)。

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

【讨论】:

  • 谢谢 - 这是一个很好的答案。知道要重写以更改所选菜单项(顶部菜单,而不是下拉菜单)的字体颜色的方法是什么吗?
  • 这不只是一个标准属性吗? menuStrip1.BackColor 似乎只更改了顶部/主菜单文本。如果您想同步一些更改来模拟发光效果,还有 MouseEnter/MouseLeave 事件。不过这可能很乏味
【解决方案2】:

要更改边框颜色,遵循已接受答案中描述的 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;
}

【讨论】:

  • 感谢您的回答。这也是一个很好的答案,但我首先看到了下面的答案并完成了整个实施。遗憾的是我只能接受 1 个答案。
【解决方案3】:

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

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

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

【讨论】:

  • Tx,不确定我是否遗漏了什么,但这些屏幕截图中的边框仍然是白色的(对于下拉菜单)。
  • 此窗口:i48.tinypic.com/2mzjfva.jpg 有深红色边框。一些额外的白色边框是由背景引起的。
  • 我指的是额外的白色边框。在我的屏幕截图中,我还为背景设置了不同的颜色(根据您引用的屏幕截图)。但两者都有那个有趣的白色小边框。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多