Modifier le comportement de dépassement de capacité ToolStripPanel pour les outils ToolStripItems ajoutés dynamiquement

StackOverflow https://stackoverflow.com/questions/604713

Question

J'ai un ToolStripPanel Windows Forms auquel j'y ajoute dynamiquement de nouveaux ToolStrips. Chaque ToolStrip a ToolStripItems que je lui ajoute de manière dynamique (principalement ToolStripButtons).

J'aimerais que tous les ToolStrip tiennent sur une seule ligne tant que vous pouvez voir tous les ToolStripItems dans chaque ToolStrip. Si l'ajout d'un nouveau ToolStripItem à un ToolStrip entraîne un débordement, j'aimerais que ToolStrip situé à la fin de la ligne passe à une nouvelle ligne. Le seul moment où j'aimerais voir le bouton de débordement est si ToolStrip contient tellement d'éléments qu'ils ne peuvent pas tenir sur la largeur du formulaire.

Je veux que ce soit le comportement par défaut à moins qu'un utilisateur ne déplace manuellement un ToolStrip. Si l'utilisateur déplace ToolStrip, je souhaite que le comportement de dépassement de capacité existant (par exemple, bouton de dépassement de capacité avec options de liste déroulante) se produise. Je suppose que l’utilisateur aura le même comportement en cas de débordement Winforms s’il positionne lui-même la barre d’outils.

Si une nouvelle barre d'outils dynamique est ajoutée après que l'utilisateur ait repositionné des éléments, j'aimerais que la nouvelle barre d'outils soit ajoutée à la droite du dernier ToolStrip dans la rangée du bas. Le comportement de débordement mis à jour dans cette barre d’outils (par exemple, utilisez une nouvelle ligne si vous ne pouvez pas vous adapter) jusqu'à ce que l'utilisateur la repositionne manuellement.

J'ai effectué des recherches sans grand succès:

  • Cela semble être une simple question de changer un ToolStripLayoutStyle , mais cela ne semble pas être le cas. (Au mieux, de nouvelles lignes sont créées lorsque le bouton de débordement apparaît sur tous les ToolStrips d'une ligne donnée).
  • L'article de MSDN & Comment: gérer ToolStrip Débordement dans Windows Forms " semble couvrir que si / quand le bouton de débordement se produit.
  • Il existe un LayoutCompleted événement sur le ToolStrip qui semble possible d’utiliser pour peaufiner les choses, il semble qu’il devrait exister un moyen plus simple.
  • Créer un LayoutEngine personnalisé semble excessif, car celui-ci est très proche de ce que je veux faire.

Me manque-t-il d'une solution facile?

MISE À JOUR: Toujours à la recherche d’une bonne solution. Il semble que l'itinéraire LayoutCompleted est possible. Le problème, c’est qu’on l’appelle plusieurs fois. Une fois, il est indiqué que ToolStripItem se trouve dans la zone de débordement et immédiatement après dans la zone principale.

Était-ce utile?

La solution 2

En fin de compte, je ne pense pas qu'il existe une bonne solution facile. Ce sujet indique clairement que ToolStrips n'a pas été conçu en priorité pour les scénarios dynamiques.

Une approche unique consiste à définir le MinimumSize correspond à la taille de tous les boutons. Cela commencera à fonctionner avec un débordement comme je le décris, mais même cela pose des problèmes avec les cas extrêmes.

La meilleure approche que j'ai trouvée consiste à faire tout ce qui est possible pour avoir une idée précise de la taille de la barre d'outils, puis à la positionner sur le ToolStripPanel à l'aide de Rejoignez la méthode . Si vous faites une estimation raisonnable à l'avance, vous pourrez probablement ajouter d'autres boutons ultérieurement, car ils se retrouveront dans la zone de débordement.

Autres conseils

1) Ajoutez les éléments à la barre d’outils

2) Comparez la largeur de la bande d’outils à la quantité d’espace disponible sur la dernière ligne. ToolStripPanel a une propriété Rows [] qui vous indiquera quelle est la dernière ligne et quelles bandes d'outils se trouvent sur cette ligne. Additionnez leurs largeurs et soustrayez-les de la largeur du panneau.

3) Ajoutez la nouvelle bande d’outils au panneau à l’aide de la méthode Join, en spécifiant la dernière ligne (si celle-ci convient) ou une ligne supérieure (si elle ne le permet pas).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top