Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改Winforms菜单下拉列表的边框颜色_C#_Winforms_Toolstripmenu - Fatal编程技术网

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

C# 更改Winforms菜单下拉列表的边框颜色,c#,winforms,toolstripmenu,C#,Winforms,Toolstripmenu,是否可以更改toolstrip菜单下拉列表的边框颜色 在我下面的示例中,我希望下拉菜单具有1种颜色(蓝色),当前不显示白色边框,但保持主菜单(“我的菜单”)项为白色 有什么想法吗 我现在无法制作演示应用程序,但是本文中的屏幕截图 证明了改变边框颜色是可能的 那个家伙开发了一些库,但它是基于标准ToolStrip实现的 我希望此链接会有所帮助。您可以为项目提供负边距以覆盖边框。是否可以更改toolstrip菜单下拉列表的边框颜色。 对。继承自ProfessionalColorTable的类按预期工

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

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

有什么想法吗


我现在无法制作演示应用程序,但是本文中的屏幕截图 证明了改变边框颜色是可能的

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


我希望此链接会有所帮助。

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

是否可以更改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()
中启用视觉样式:

您可能还希望禁用系统颜色,如ctor中所示。无论是否启用视觉样式,默认值都应为false,但可能是其他因素改变了它

base.UseSystemColors = false;
EnableVisualStyles()
UseSystemColors=false必须到位,才能实现颜色表中的所有渲染元素,否则仅使用部分渲染元素。(尽管,
MenuBorder
似乎无论如何都能工作。)否则,结果与预期一样:

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

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

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

将鼠标放在其中一个项目上(未显示鼠标),该项目使用一致的
MenuItemSelected
颜色

如果您在使覆盖正常工作时遇到困难,请检查您是否使用了正确的覆盖(或者它们的含义与名称相同,有些一开始会产生误导)


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

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

解决方案1
您可以通过实现继承和覆盖正确属性的自定义颜色表来实现这一点。为此,请执行以下步骤:

步骤

  • 在表单上放置一个ToolStrip,添加DropDownButton及其子项,并将子项的前景色设置为白色
  • 创建从继承的CustomColorTable类
  • 覆盖ImageMarginGradientBegin、ImageMarginGradientMiddle、ImageMarginGradientEnd、ToolStripDropDownBackground并返回所需颜色(蓝色)。从
  • 在窗体中,将的Load event set 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());
    }
    
    表单加载代码

    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
    如果您不想在菜单项中使用图像,还可以使用另一种解决方案。在这种情况下,找到dropdownbutton的下拉属性并将其强制转换为ToolStripDropDownMenu,然后将其ShowImageMargin属性设置为false,将其BackColor设置为所需的颜色(蓝色)


    你在找这个问题吗:?嗯,可能是重复的。但我仍然不知道要覆盖什么属性才能获得想要的效果。我尝试了MenuItemOrder和MenuByOrder,但它没有改变。要改变边框颜色,只需遵循公认答案中描述的@Proputix解决方案即可。但是要删除项目和菜单边框之间的白色边框,请考虑下面的一个解决方案。作为记录:Reza的解决方案也会起作用。Tx,不确定我是否遗漏了什么,但这些屏幕截图中的边框仍然是白色的(对于下拉菜单)。此窗口:具有暗红色边框。一些额外的白色边框是由背景造成的。我指的是额外的白色边框。在我的屏幕截图上,我也得到了不同颜色的背景(根据你参考的屏幕截图)。但两者都有一个有趣的白色小边框。谢谢-这是一个很好的答案。你知道用什么方法来改变所选菜单项(顶部菜单,而不是下拉菜单)的字体颜色吗?这不是一个标准属性吗
    menuStrip1.背景色
    似乎只会更改顶部/主菜单文本。如果您希望同步一些更改以模拟辉光效果,还将出现MouseEnter/MouseLeave事件。那可能很乏味,谢谢你的回答。这也是一个很好的答案,但我首先看到了下面的答案,并完成了整个实现。遗憾的是,我只能接受一个答案。