2008-10-24 4 views
1

J'ai besoin de remplacer la fonction de débordement standard dans un ToolStrip par un bouton "Plus ..." qui ferait alors apparaître un menu avec les éléments débordés. Est-ce que quelqu'un a des idées sur la façon d'accomplir cela?ToolStrip Overflow

Répondre

2

J'ai écrit quelque chose de très similaire à cela il y a quelque temps. Le code que j'ai utilisé est collé ci-dessous, et vous êtes libre de le modifier pour répondre à vos besoins. Le ToolStripCustomiseMenuItem est essentiellement votre bouton "Plus" qui remplit un menu contextuel DropDown lorsque vous cliquez dessus. J'espère que cela vous aide, à tout le moins cela devrait être un bon point de départ ...

public class ToolStripCustomiseMenuItem : ToolStripDropDownButton { 
     public ToolStripCustomiseMenuItem() 
      : base("Add Remove Buttons") { 
      this.Overflow = ToolStripItemOverflow.Always; 
      DropDown = CreateCheckImageContextMenuStrip(); 
     } 

    ContextMenuStrip checkImageContextMenuStrip = new ContextMenuStrip(); 
    internal ContextMenuStrip CreateCheckImageContextMenuStrip() { 
     ContextMenuStrip checkImageContextMenuStrip = new ContextMenuStrip(); 
     checkImageContextMenuStrip.ShowCheckMargin = true; 
     checkImageContextMenuStrip.ShowImageMargin = true; 
     checkImageContextMenuStrip.Closing += new ToolStripDropDownClosingEventHandler(checkImageContextMenuStrip_Closing); 
     checkImageContextMenuStrip.Opening += new CancelEventHandler(checkImageContextMenuStrip_Opening); 
     DropDownOpening += new EventHandler(ToolStripAddRemoveMenuItem_DropDownOpening); 
     return checkImageContextMenuStrip; 
    } 

    void checkImageContextMenuStrip_Opening(object sender, CancelEventArgs e) { 

    } 

    void ToolStripAddRemoveMenuItem_DropDownOpening(object sender, EventArgs e) { 
     DropDownItems.Clear(); 
     if (this.Owner == null) return; 
     foreach (ToolStripItem ti in Owner.Items) { 
      if (ti is ToolStripSeparator) continue; 
      if (ti == this) continue; 
      MyToolStripCheckedMenuItem itm = new MyToolStripCheckedMenuItem(ti); 
      itm.Checked = ti.Visible; 
      DropDownItems.Add(itm); 
     } 
    } 

    void checkImageContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e) { 
     if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) { 
      e.Cancel = true; 
     } 
    } 
} 

internal class MyToolStripCheckedMenuItem : ToolStripMenuItem { 
    ToolStripItem tsi; 
    public MyToolStripCheckedMenuItem(ToolStripItem tsi) 
     : base(tsi.Text) { 
     this.tsi = tsi; 
     this.Image = tsi.Image; 
     this.CheckOnClick = true; 
     this.CheckState = CheckState.Checked; 
     CheckedChanged += new EventHandler(MyToolStripCheckedMenuItem_CheckedChanged); 
    } 

    void MyToolStripCheckedMenuItem_CheckedChanged(object sender, EventArgs e) { 
     tsi.Visible = this.Checked; 
    } 

} 
0

Vous pouvez piéger l'événement de peinture sur le bouton en appelant

toolStrip1.OverflowButton.Paint += new PaintEventHandler(OverflowButton_Paint); 

Ce qui, en théorie, devrait vous permettre de faire dire « Mais ... », mais je ne pouvais pas régler la largeur du trop-plein Le bouton est autre chose que la largeur par défaut (étroite).

En outre, une autre idée était que vous pouvez intercepter VisibleChanged sur le OverflowButton puis injecter manuellement un bouton de division dans la barre d'outils. La partie difficile est de savoir où mettre ce bouton.

Questions connexes