C# WinForms ToolStripMenuItem 如何更改背景颜色

4

好的,请告诉我为什么这不起作用。

我在一个c# winforms应用程序中有一个简单的MenuStrip。它具有ToolStripMenuItems。

在设计器的属性窗口中,我选择BackColor = White。 在Desginer.cs文件中,我可以看到它。

运行应用程序,背景色是Control(灰色)。

出了什么问题?为什么背景颜色不是白色?

谢谢

编辑

这是来自Designer.cs的代码:

   this.menuRefresh.BackColor = System.Drawing.Color.White;

刷新项应该是白色的

编辑2:

在代码中,在加载表单后(在构造函数和Form_Load事件中),我放置了以下内容:

 menuRefresh.BackColor = Color.White;

同时也没有帮助。

发布代码,如果您是通过设计器设置的,请发布设计器所生成的代码。另外,我们想要看到输出结果。可以是一张图片吗? - Sriram Sakthivel
视觉样式覆盖了设计师的设置。 - DonBoitnott
menuRefresh 的类型是什么? ToolStripMenuItem 还是其他什么? - Sriram Sakthivel
@SriramSakthivel 是的,那是它的类型。 - Ehud Grand
2
你是否设置了自定义渲染器?我的意思是 menuStrip.Renderer = new MyRenderer()?你能否发布一个小而完整的示例来演示问题? - Sriram Sakthivel
3个回答

7
你需要实现一个简单的渲染器类来实现这个功能。这里是一个例子:
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
      InitializeComponent(); 
      menuStrip1.Renderer = new MyRenderer(); 
    } 

    private class MyRenderer : ToolStripProfessionalRenderer 
    { 
        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)      
        { 
            Rectangle rc = new Rectangle(Point.Empty, e.Item.Size); 
            Color c = e.Item.Selected ? Color.Azure : Color.Beige; 
            using (SolidBrush brush = new SolidBrush(c)) 
                e.Graphics.FillRectangle(brush, rc); 
        } 
    } 
} 

1
@user1223457:所以...你一开始就使用了自定义渲染器?为什么没有在你的问题中提到这个? - musefan

1
< p > MenuStripBackColor属性并不决定任何工具栏菜单(下拉菜单)中包含的项目的背景颜色。这些项目都有自己的BackColor属性,必须单独设置。

例如,您的“刷新”项目是一个独立的ToolStripMenuItem,因此您需要将其BackColor设置为白色。


关于您的第二次编辑,设置menuRefresh.BackColor = Color.White; 应该可以在构造函数或Form_Load事件中正常工作。我已经测试过了两种情况,都按预期工作。

似乎操作将 ToolStripMenuItemBackColor 设定为了仅此而已。 - Sriram Sakthivel
这是我做的:menuRefresh.BackColor = Color.White; 但它没有起作用。 - Ehud Grand
@user1223457:你展示的代码应该可以正常工作。你能否尝试通过设计师设置它,看看是否有任何影响?就目前而言,你所包含的代码不足以复制这个问题。 - musefan

0

我想做同样的事情来创建一个contextmenustrip标题,我可以设置toolstripmenuitem的背景、前景和边框颜色。

这与其他答案类似,但更加自包含。

它的外观

代码实现方式如下:

ContextMenustrip.Items.Add(new CustomCMSItems.ToolStripHeader("Shifts", new Font("Segoe UI", 10, FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 1, false), Color.Black, Color.LightGray, Color.Red));


public class ToolStripHeader : ToolStripMenuItem
{
    Color _BackColor;
    Color _BorderColor;
    Color _FontColor;
    Font _Font;//= new Font("Segoe UI", 10, FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 1, false)

    public ToolStripHeader(string text, Font font, Color textcolor, Color BackgroundColor, Color BorderColor) //: base(new Label())
    {
        this.Padding = Padding.Empty;

        _BackColor = BackgroundColor;
        _BorderColor = BorderColor;
        _FontColor = textcolor;
        _Font = font;

        this.Text = text;
    }

    protected override void OnParentChanged(ToolStrip oldParent, ToolStrip newParent)
    {
        base.OnParentChanged(oldParent, newParent);

        if (newParent != null)
        {
            if (newParent.GetType() == typeof(ContextMenuStrip))
            {
                newParent.Renderer = new HeaderRenderer(_Font, _FontColor, _BackColor, _BorderColor);
            }
        }
    }

    private class HeaderRenderer : ToolStripProfessionalRenderer
    {
        Color _BackColor;
        Color _BorderColor;
        Color _FontColor;
        Font _Font;//= new Font("Segoe UI", 10, FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 1, false)

        public HeaderRenderer(Font font, Color textcolor, Color BackgroundColor, Color BorderColor) //: base(new Label())
        {


            _BackColor = BackgroundColor;
            _BorderColor = BorderColor;
            _FontColor = textcolor;
            _Font = font;

        }

        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
        {
            if (e.Item.GetType() == typeof(ToolStripHeader))
            {
                Rectangle rc = new Rectangle(Point.Empty, e.Item.Size);

                SolidBrush brush = new SolidBrush(_BackColor);
                Pen pen = new Pen(_BorderColor);

                e.Graphics.FillRectangle(brush, rc);
                e.Graphics.DrawRectangle(pen, 1, 0, rc.Width - 2, rc.Height - 1);

                return;
            }

            base.OnRenderMenuItemBackground(e);

            if (!e.Item.Selected) base.OnRenderMenuItemBackground(e);
            else
            {
                //Example
                //Rectangle rc = new Rectangle(Point.Empty, e.Item.Size);
                //e.Graphics.FillRectangle(Brushes.DarkGray, rc);
                //e.Graphics.DrawRectangle(Pens.Black, 1, 0, rc.Width - 2, rc.Height - 1);

            }
        }

        protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
        {
            if (e.Item.GetType() == typeof(ToolStripHeader))
            {
                e.TextColor = _FontColor;
                e.TextFont = _Font;
            }
            base.OnRenderItemText(e);
        }

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接