2017-04-01 2 views
1

J'ai un ToolStripSplitButton avec divers éléments dans la liste déroulante. L'un d'entre eux est une barre de contrôle incluse dans un ToolStripControlHost, appelé ToolStripTrackbarItem. Il est le code (je l'ai de stackoverflow):Afficher l'image pour ToolStripControlHost dans le menu déroulant

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

Il fonctionne, mais je dois montrer des images à la gauche des éléments de liste déroulante:

menu

je réussis avec un ToolStripMenuItem simple en définissant la propriété Image. Cependant, il est inefficace de définir la propriété Image de mon ToolStripTrackbarItem (héritée de ToolStripControlHost, voir le code ci-dessus). Selon MSDN, la propriété Image n'est pas pertinente pour ToolStripControlHost.

Qu'est-ce que cela signifie? N'est-il même pas possible d'inclure une image à ToolStripControlHost?

Si c'est possible quand même, comment faire?

Répondre

1

Vous devez résoudre 2 problèmes ici:

  • ToolStripControlHost ne montre pas Image propriété et aussi ne sérialisation pas l'image lorsque vous enregistrez le formulaire.
  • ToolStripProfessionalRendered ne dessine pas l'image pour ToolStripControlHost.

Vous devez remplacer la propriété Image de ToolStripControlHost et la rendre navigable et sérialisable. Vous devez également créer un moteur de rendu personnalisé pour dessiner l'image dans l'emplacement et la taille appropriés. Ensuite, si vous définissez simplement le moteur de rendu pour ToolStrip en utilisant ci-dessous le code, vous obtiendrez résultat escompté:

this.toolStrip1.Renderer = new MyCustomRenderer(); 

enter image description here

ToolStripTrackBar

L'élément permet Image propriété de montrer dans la grille de la propriété et laissez il sérialiser lors de la sauvegarde de la forme.

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

Cette renderer dessine des images pour 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); 
      } 
     }); 
    } 
}