在 ToolStripMenu 中设置第一个 MenuItem 颜色(C#、WinForms)

问题描述 投票:0回答:1

enter image description here

我来这里寻求帮助或建议。我正在创建一个颜色较深的自定义菜单。几乎一切都很好。我唯一不明白的是为什么第一个

MenuItem
有默认的背景色。问题是第二个颜色正确。我不知道我是否遗漏了一些东西,例如第一个在启动时获得设置的颜色或什么。

我在一个测试项目上尝试了我的代码,其中条带具有默认的红色,并且在

Form_Load
上我更改了它。它们都工作得很好。这是我正在使用的代码


namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            menuStrip1.Renderer = new SkinRenderer(new MenuColorTable());
        }
        class MenuColorTable : ProfessionalColorTable
        {
            public MenuColorTable()
            {
                base.UseSystemColors = false;
            }
            public override Color MenuItemSelectedGradientBegin
            {
                get { return Color.FromArgb(12, 46, 73); }
            }
            public override Color MenuItemSelectedGradientEnd
            {
                get { return Color.FromArgb(12, 46, 73); }
            }
            public override Color MenuItemPressedGradientBegin
            {
                get { return Color.FromArgb(6, 6, 6); }
            }
            public override Color MenuItemPressedGradientMiddle
            {
                get { return Color.FromArgb(6, 6, 6); }
            }
            public override Color MenuItemPressedGradientEnd
            {
                get { return Color.FromArgb(6, 6, 6); }
            }
            public override Color MenuBorder
            {
                get { return Color.FromArgb(127, 127, 127); }
            }
            public override Color ToolStripDropDownBackground
            {
                get { return Color.FromArgb(2, 2, 2); }
            }
            public override Color ImageMarginGradientBegin
            {
                get { return Color.FromArgb(10, 10, 10); }
            }
            public override Color ImageMarginGradientMiddle
            {
                get { return Color.FromArgb(10, 10, 10); }
            }
            public override Color ImageMarginGradientEnd
            {
                get { return Color.FromArgb(10, 10, 10); }
            }
            public override System.Drawing.Color MenuItemBorder
            {
                get { return Color.FromArgb(40, 158, 255); }
            }
            public override Color MenuItemSelected
            {
                get { return Color.FromArgb(12, 46, 73); ; }
            }
        }

        private class SkinRenderer : ToolStripProfessionalRenderer
        {
            private SkinRenderer() : base() { }
            public SkinRenderer(MenuColorTable colorTable) : base(colorTable) => Console.WriteLine("test");
            protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
            {
                e.TextColor = Color.FromArgb(220, 220, 220); ;
                TextRenderer.DrawText(e.Graphics, e.Text, e.TextFont, e.TextRectangle, e.TextColor, e.TextFormat);
            }
            protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
            {
                ToolStripMenuItem item = e.Item as ToolStripMenuItem;
                if (item != null) { e.ArrowColor = Color.FromArgb(220, 220, 220); }
                base.OnRenderArrow(e);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            menuStrip1.BackColor = Color.FromArgb(30, 30, 30);
        }
    }

}

我认为我的代码中有某些东西导致了这种行为,但我不确定。我的意思是,在启动时,条带确实具有默认颜色,并且在加载事件期间我更改了该颜色,但为什么第一个项目保持默认白色,而第二个项目变成与条带应有的颜色相同?有任何想法吗?需要明确的是,除此之外,代码中似乎没有任何内容可以更改菜单的颜色。我尝试在这里搜索属性https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.professionalcolortable?view=windowsdesktop-8.0但我找不到它。我错过了吗?确实,我可以强制特定控件在加载时改变颜色,例如

thisItem.BackColor =
,但是为什么在理论上它应该已经可以正常工作的情况下强制执行某些操作呢?

c# winforms toolstripmenu
1个回答
0
投票

如果我在属性窗口中将第一个菜单项的

BackColor
设置为
Control
以外的值,我可以重现此情况。

确保属性窗口中的

BackColor
设置为
Control
,否则此颜色将优先于渲染器的MenuColorTable。

© www.soinside.com 2019 - 2024. All rights reserved.