2

アプリケーションで 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 が原因で、この問題を解決する簡単な解決策を見つけることができません

4

1 に答える 1

4

コードを理解するのは難しいため、_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();
    }

正常に動作します。

于 2014-10-28T20:40:42.533 に答える