2017-04-01 11 views
1

私は、ドロップダウンリストにさまざまな要素を持つToolStripSplitButtonを持っています。 その1つは、ToolStripControlHostで囲まれた、ToolStripTrackbarItemと呼ばれるトラックバーです。私はと成功したんだドロップダウンメニューのToolStripControlHostの画像を表示

menu

:それは動作しますが、私は、ドロップダウン項目の左側に画像を表示する必要が

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 

namespace Application 
{ 
    [System.ComponentModel.DesignerCategory("code")] 
    [System.Windows.Forms.Design.ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip | ToolStripItemDesignerAvailability.MenuStrip)] 

    public class ToolStripTrackbarItem : ToolStripControlHost 
    { 
     public ToolStripTrackbarItem() 
      : base(CreateControlInstance()) 
     { 
      this.Size = Control.Size; 
     } 
     public TrackBar TrackBar 
     { 
      get { return Control as TrackBar; } 
     } 
     private static Control CreateControlInstance() 
     { 
      TrackBar t = new TrackBar(); 
      t.AutoSize = false; 
      return t; 
     } 
     [DefaultValue(0)] 
     public int Value 
     { 
      get { return TrackBar.Value; } 
      set { TrackBar.Value = value; } 
     } 
     protected override void OnSubscribeControlEvents(Control control) 
     { 
      base.OnSubscribeControlEvents(control); 
      TrackBar trackBar = control as TrackBar; 
      trackBar.ValueChanged += new EventHandler(trackBar_ValueChanged); 
     } 
     protected override void OnUnsubscribeControlEvents(Control control) 
     { 
      base.OnUnsubscribeControlEvents(control); 
      TrackBar trackBar = control as TrackBar; 
      trackBar.ValueChanged -= new EventHandler(trackBar_ValueChanged); 
     } 
     void trackBar_ValueChanged(object sender, EventArgs e) 
     { 
      if (this.ValueChanged != null) 
       ValueChanged(sender, e); 
     } 
     public event EventHandler ValueChanged; 
     protected override Size DefaultSize 
     { 
      get { return new Size(300, 16); } 
     } 
    } 

:それはコード(私はstackoverflowのからそれを持っている)ですImageプロパティを設定して、単純なToolStripMenuItemを作成します。ただし、ToolStripTrackbarItem(ToolStripControlHostから継承され、上のコードを参照)のImageプロパティを設定することは効果的ではありません。 MSDNによると、ImageプロパティはToolStripControlHostとは無関係です。

この意味は? ToolStripControlHostに残されたイメージを含めることさえできませんか?

とにかく可能なら、どうすればいいですか?

答えて

1

あなたはここで2つの問題を解決する必要があります。

  • ToolStripControlHostImageプロパティを表示しませんし、また、フォームを保存するときに画像をシリアル化しません。
  • ToolStripProfessionalRenderedToolStripControlHostの画像を描画していません。

ImageプロパティをToolStripControlHostに上書きし、ブラウズ可能でシリアライズ可能にする必要があります。また、イメージを正しい位置とサイズで描画するために、カスタムレンダラーを作成する必要があります。あなたは、単にコードの下に使用してToolStripのためのレンダラを設定している場合次に、あなたが期待されます結果:

this.toolStrip1.Renderer = new MyCustomRenderer(); 

enter image description here

ToolStripTrackBar

アイテムは、プロパティグリッドに表示してみましょうするImageプロパティを可能にしますフォームを保存するときにシリアル化されます。

using System.ComponentModel; 
using System.Drawing; 
using System.Linq; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.All)] 
public class ToolStripTrackBar : ToolStripControlHost 
{ 
    public TrackBar TrackBar { get { return (TrackBar)Control; } } 
    public ToolStripTrackBar() : base(CreateControl()) { } 
    private static TrackBar CreateControl() 
    { 
     var t = new TrackBar() 
     { TickStyle = TickStyle.None, AutoSize = false, Height = 28 }; 
     return t; 
    } 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public override Image Image 
    { 
     get { return base.Image; } 
     set { base.Image = value; } 
    } 
    /*Expose properties and events which you need.*/ 
    public int Value 
    { 
     get { return TrackBar.Value; } 
     set { TrackBar.Value = value; } 
    } 
} 

MyCustomRenderer

このレンダラーはToolStripTrackBarために画像を描画します。

using System.Drawing; 
using System.Linq; 
using System.Windows.Forms; 
public class MyCustomRenderer : ToolStripProfessionalRenderer 
{ 
    protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) 
    { 
     base.OnRenderImageMargin(e); 
     e.ToolStrip.Items.OfType<ToolStripTrackBar>() 
     .ToList().ForEach(item => 
     { 
      if (item.Image != null) 
      { 
       var size = item.GetCurrentParent().ImageScalingSize; 
       var location = item.Bounds.Location; 
       location = new Point(5, location.Y + 1); 
       var imageRectangle = new Rectangle(location, size); 
       e.Graphics.DrawImage(item.Image, imageRectangle, 
        new Rectangle(Point.Empty, item.Image.Size), 
        GraphicsUnit.Pixel); 
      } 
     }); 
    } 
}