2014-10-28 58 views
1

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

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

当我调用渲染()方法

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

    customRenderer.Render(); 
的颜色

我知道箭头变白了,但是因为这条线我失去了第一个变化

ToolStripManager.Renderer = this; 

我无法找到一个简单的解决方案来解决这个问题,因为静态类ToolStripManager

回答

3

很难使代码的感觉,你一定要摆脱_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(); 
    } 

工作正常。