2014-10-28 33 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(); 
    } 

工作正常。