c# - 在c#中自定义ToolStripMenuItems

标签 c# visual-studio-2008 toolstripmenu

我需要在我的应用程序中自定义 ToolStripMenuItems。 每个打开子菜单的 ToolStripMenuItem 的文本附近都有一个黑色箭头。 我想更改一些颜色(MenuItemSelected、MenuItemBorder、MenuItemSelectedGradientBegin,...)以及该箭头的颜色。我创建了一个 MyColor 类来解决第一个问题

public class MyColorTable : ProfessionalColorTable
{
  public override Color MenuItemSelected
  {
    get { return Color.Silver; }
  }

  public override Color MenuItemBorder
  {
    get { return Color.WhiteSmoke; }
  }

  public override Color MenuItemSelectedGradientBegin
  {
    get { return Color.FromArgb(60, 60, 60); }
  } 
}

另一个类来改变箭头的颜色

public class CustomToolStripRenderer : ToolStripProfessionalRenderer
{
  private readonly ToolStripProfessionalRenderer _toolStripRenderer;

  public CustomToolStripRenderer(ToolStripProfessionalRenderer toolStripRenderer)
  {
    _toolStripRenderer = toolStripRenderer;
  }

  protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
  {
   var tsMenuItem = e.Item as ToolStripMenuItem;
   if (tsMenuItem != null)
     e.ArrowColor = Color.White;
   base.OnRenderArrow(e);
  }

  public void Render()
  {
   _toolStripRenderer.RoundedEdges = false;
   ToolStripManager.Renderer = this;
   //ToolStripManager.Renderer = _toolStripRenderer;
  }
}

当我调用 Render() 方法时

    CustomToolStripRenderer customRenderer = new CustomToolStripRenderer(new ToolStripProfessionalRenderer(new MyColorTable()));

    customRenderer.Render();

我发现箭头变成白色,但由于这一行我失去了第一个更改

 ToolStripManager.Renderer = this;

由于静态类 ToolStripManager,我无法找到简单的解决方案来解决此问题

最佳答案

很难理解代码,您肯定需要删除 _toolStripRenderer 变量。我会写:

    public class CustomToolStripRenderer : ToolStripProfessionalRenderer {
        public CustomToolStripRenderer() : base(new MyColorTable()) {
            this.RoundEdges = true;
        }
        protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) {
            // etc..
        }
    } 

然后在表单构造函数中:

    public Form1() {
        InitializeComponent();
        ToolStripManager.Renderer = new CustomToolStripRenderer();
    }

工作正常。

关于c# - 在c#中自定义ToolStripMenuItems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614398/

相关文章:

c# - ICSharpCode.TextEditor 垂直滚动

c# - 如何将运行时错误更改为英文

c# - 将 ToolStripMenuItem 添加到特定索引处的 ContextMenuStrip

c# 从另一个表单更改已经打开的表单?

colors - 如何更改工具条菜单项边框颜色?

java - 从 C# 中的 List 获取对象变量

c# - 使用 ASP.net C# 写入网络文件夹

c# - 将信息同步保存到文件的最佳方式

C#:如何从另一个类更改 form1 中标签的文本?

visual-studio-2008 - 如何阻止 VS2008 错误列表中出现 CSS 验证错误