简体   繁体   English

Winforms MenuStrip-如何更改下拉菜单项左侧的白线?

[英]Winforms MenuStrip - How to change white line on left edge of dropdown items?

How do I change the color of this white line on a MenuStrip? 如何更改MenuStrip上此白线的颜色? I can't figure out what property to use. 我不知道要使用什么属性。

主菜单

So far I'm using this code to style all the other parts: 到目前为止,我正在使用此代码来设置所有其他部分的样式:

internal static class Clr
{
    public static Color White = Color.FromArgb(255, 255, 255);
    public static Color Grey64 = Color.FromArgb(64, 64, 64);
    public static Color Grey86 = Color.FromArgb(86, 86, 86);
    public static Color Grey127 = Color.FromArgb(127, 127, 127);
    public static Color Red = Color.FromArgb(255, 0, 0);
    public static Color Blue = Color.FromArgb(0, 0, 255);
    public static Color Green = Color.FromArgb(0, 255, 0);
}
public class Grey64Menu
{
    public void ConfigureMenu(ToolStrip toolStrip)
    {
        toolStrip.Renderer = new ToolStripProfessionalRenderer(new Grey64ClrTable());

        foreach (var topLevelItem in toolStrip.Items)
        {
            ToolStripMenuItem mainItem = (ToolStripMenuItem)topLevelItem;
            mainItem.ForeColor = Clr.White;
            mainItem.BackColor = Clr.Grey64;

            foreach (var itm in mainItem.DropDownItems)
            {
                ToolStripMenuItem m = (ToolStripMenuItem)itm;
                m.ForeColor = Clr.White;
                m.BackColor = Clr.Grey64;
            }

        }
    }
}

public class Grey64ClrTable : ProfessionalColorTable
{

    public override Color MenuBorder => Clr.Grey86;
    public override Color MenuItemBorder => Clr.Grey127;
    public override Color MenuStripGradientBegin => Clr.Red;
    public override Color MenuStripGradientEnd => Clr.Red;

    public override Color ToolStripGradientBegin => Clr.Red;
    public override Color ToolStripGradientEnd => Clr.Red;
    public override Color ToolStripBorder => Clr.Blue;

    //Dropdown Border Color
    public override Color ToolStripDropDownBackground => Clr.Grey64;

    public override Color MenuItemSelected => Clr.Grey86;
    public override Color MenuItemSelectedGradientBegin => Clr.Grey86;
    public override Color MenuItemSelectedGradientEnd => Clr.Grey86;
    public override Color MenuItemPressedGradientBegin => Clr.Grey86;
    public override Color MenuItemPressedGradientEnd => Clr.Grey86;
}

An alternative method, using a custom ToolStripProfessionalRenderer , to override OnRenderItemText and eliminate that initial loop ( foreach (var topLevelItem in toolStrip.Items) ) that doesn't consider sub-items. 另一种方法是使用自定义ToolStripProfessionalRenderer重写OnRenderItemText并消除不考虑子项的初始循环( foreach (var topLevelItem in toolStrip.Items) )。

Also, ImageMarginGradientMiddle should be set as well, otherwise you'll have weird results when adding sub-items. 另外,还应设置ImageMarginGradientMiddle ,否则添加子项时会有奇怪的结果。 You shuld override the other middle parts, too. 您也应该覆盖其他中间部分。

You could add a public property to the custom renderer, to change the Menu text ForeColor when required. 您可以将公共属性添加到自定义渲染器,以在需要时更改菜单文本ForeColor。

public class Grey64Menu
{
    public Grey64Menu() : this(null) { }
    public Grey64Menu(ToolStrip menu) {
        if (menu != null) {
            ConfigureMenu(menu);
        }
    }
    public void ConfigureMenu(ToolStrip toolStrip)
    {
        toolStrip.Renderer = new MyMenuRenderer();
    }
}

public class MyMenuRenderer : ToolStripProfessionalRenderer
{
    public MyMenuRenderer() : this(new Grey64ClrTable()) { }
    public MyMenuRenderer(ProfessionalColorTable colorTable) : base(colorTable) { }

    protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
    {
        e.Item.ForeColor = Clr.White;
        base.OnRenderItemText(e);
    }
}

public class Grey64ClrTable : ProfessionalColorTable
{
    // (...)
    // Fill the Image area: ImageMarginGradientMiddle is required for sub-items
    public override Color ImageMarginGradientMiddle => Clr.Grey64;
    public override Color ImageMarginGradientBegin => Clr.Grey64;
    public override Color ImageMarginGradientEnd => Clr.Grey64;
}

Per Hans Passant's comment: Per Hans Passant的评论:

That line is the background color for the Image Margin. 那条线是图像边距的背景色。 So I was able to fix it by adding these two lines to my ProfessionalColorTable: 因此,我可以通过将以下两行添加到我的ProfessionalColorTable中来解决此问题:

public override Color ImageMarginGradientBegin => Clr.Grey64;
public override Color ImageMarginGradientEnd => Clr.Grey64;

Thank you, Hans Passant 谢谢Hans Passant

You can do this by creating your own ColorTable, and overriding the properties you wish to change the colour of: 您可以通过创建自己的ColorTable并覆盖要更改其颜色的属性来做到这一点:

public  class TestColorTable : ProfessionalColorTable
{
    public override Color MenuItemSelected
    {
        get { return Color.Red; }
    }

    public override Color MenuBorder
    {
        get { return Color.Green; }
    }

}

You would use it like this: 您可以这样使用它:

private void Form1_Load(object sender, EventArgs e)
{
    menuStrip1.Renderer = new ToolStripProfessionalRenderer(new TestColorTable());
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM