簡體   English   中英

Winforms MenuStrip-如何更改下拉菜單項左側的白線?

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

如何更改MenuStrip上此白線的顏色? 我不知道要使用什么屬性。

主菜單

到目前為止,我正在使用此代碼來設置所有其他部分的樣式:

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

另一種方法是使用自定義ToolStripProfessionalRenderer重寫OnRenderItemText並消除不考慮子項的初始循環( foreach (var topLevelItem in toolStrip.Items) )。

另外,還應設置ImageMarginGradientMiddle ,否則添加子項時會有奇怪的結果。 您也應該覆蓋其他中間部分。

您可以將公共屬性添加到自定義渲染器,以在需要時更改菜單文本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的評論:

那條線是圖像邊距的背景色。 因此,我可以通過將以下兩行添加到我的ProfessionalColorTable中來解決此問題:

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

謝謝Hans Passant

您可以通過創建自己的ColorTable並覆蓋要更改其顏色的屬性來做到這一點:

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

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

}

您可以這樣使用它:

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