Question

J'utilise .net 2.0 avec Visual Studio 2005 et j'essaie d'ajouter deux bandes d'outils différentes en haut du formulaire afin qu'elles s'affichent côte à côte. Je veux que ce soit comme Word 2003, où vous pouvez ajouter plusieurs barres d’outils à la même ligne et les faire apparaître en ligne les unes avec les autres, au lieu de dédier une ligne à chaque bande d’outils.

J'ai donc ajouté un ToolStripPanel et je l'ai ancré en haut du formulaire (je n'ai pas utilisé ToolStripContainer car je n'ai pas besoin de tous les panneaux supplémentaires; j'ai juste besoin de celui situé en haut). J'ai ajouté les deux bandes d'outils et défini leurs propriétés Stretch sur False. Je peux les faire apparaître côte à côte dans la fenêtre du concepteur, mais au moment de l'exécution, ToolStripPanel sépare les barres d'outils et attribue à chaque barre d'outils sa propre ligne dédiée. Comme si pour ajouter l'insulte à la blessure, quand j'arrête le débogage et que je reviens au concepteur, je constate que le concepteur déplace également les bandes d'outils vers leur propre rangée! Est-ce que je fais quelque chose de mal ici?

J'ai été sur Google toute la journée et j'ai trouvé des informations sur un objet ToolStripPanelRow, mais je ne vois pas de moyen facile d'y ajouter des bandes d'outils (c'est-à-dire qu'il n'a pas de méthode ToolStripPanelRow.Controls.Add ou autre chose du genre. ), tout ce qu’elle a est une propriété Controls () qui renvoie un tableau d’objets de contrôle, et je n’ai pas eu beaucoup de chance en essayant d’ajouter des éléments à ce tableau. J'ai également trouvé de la documentation sur la méthode ToolStripPanel.Join, qui semble devoir faire l'affaire. J'ai donc essayé les 3 surcharges, mais elles ne fonctionnent pas comme prévu. Peu importe ce que je fais ou quelles options j'essaye, il ajoute toujours la nouvelle bande d'outils en haut du panneau, à sa propre rangée, et fait tout le reste.

Dans l’intérêt d’une divulgation complète, je tiens à vous avertir que j’ai le ToolStripPanel et l’une des barres d’outils ajoutées à un formulaire de classe de base et que je tente d’ajouter l’autre à un formulaire de sous-classe hérité du formulaire de classe de base. ToolStripPanel et ToolStrip dans la forme de la classe de base sont tous deux déclarés "Protected Friend", donc cela devrait fonctionner. Comme je l'ai mentionné, la fenêtre de conception du formulaire de sous-classe me permettra de le faire (au moins pour un temps).

Si quelqu'un pouvait m'aider à faire en sorte que cela fonctionne ou au moins à expliquer pourquoi cela ne fonctionnait pas, je vous en serais extrêmement reconnaissant.

Était-ce utile?

La solution

J'ai créé un ToolStripPanel personnalisé afin de pouvoir surcharger le LayoutEngine;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomToolStripPanel : ToolStripPanel
  {
    private LayoutEngine _layoutEngine;

    public override LayoutEngine LayoutEngine
    {
      get
      {
        if (_layoutEngine == null) _layoutEngine = new CustomLayoutEngine();
        return _layoutEngine;
      }
    }

    public override Size GetPreferredSize(Size proposedSize)
    {
      Size size = base.GetPreferredSize(proposedSize);

      foreach(Control control in Controls)
      {
        int newHeight = control.Height + control.Margin.Vertical + Padding.Vertical;
        if (newHeight > size.Height) size.Height = newHeight;
      }

      return size;
    }
  }
}

Ensuite, le LayoutEngine personnalisé présente les barres d’outils;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomLayoutEngine : LayoutEngine
  {
    public override bool Layout(object container, LayoutEventArgs layoutEventArgs)
    {
      Control parent = container as Control;

      Rectangle parentDisplayRectangle = parent.DisplayRectangle;

      Control [] source = new Control[parent.Controls.Count];
      parent.Controls.CopyTo(source, 0);

      Point nextControlLocation = parentDisplayRectangle.Location;

      foreach (Control c in source)
      {
        if (!c.Visible) continue;

        nextControlLocation.Offset(c.Margin.Left, c.Margin.Top);
        c.Location = nextControlLocation;

        if (c.AutoSize)
        {
          c.Size = c.GetPreferredSize(parentDisplayRectangle.Size);
        }

        nextControlLocation.Y = parentDisplayRectangle.Y;
        nextControlLocation.X += c.Width + c.Margin.Right + parent.Padding.Horizontal;
      }

      return false;
    }
  }
}

Une chose qui a pris du temps est que changer l'emplacement / la taille d'un élément ToolStrip provoque la ré-activation de la présentation, avec les commandes réorganisées. Je prends donc une copie des contrôles avant la boucle de mise en page. Et vous ne pouvez pas utiliser AddRange (...) pour ajouter des éléments au panneau personnalisé pour une raison quelconque - vous devez les ajouter (...) un à un.

J'espère que cela aide (il est basé sur Exemple MSDN LayoutEngine , corrigé pour ToolStripPanels)

Wyzfen

Autres conseils

System.Windows.Forms.FlowLayoutPanel peut faire le travail.

Il suffit de placer les commandes ToolStrip dans le bon ordre.

Je pense que dans votre cas, vous pouvez vous contenter de définir LayoutStyle sur votre ToolStrip sur ToolStripLayoutStyle.HorizontalStackWithOverflow plutôt que d'avoir besoin de votre propre LayoutEngine personnalisé.

J'ai posé une question différente sur un sujet similaire comment gérer la disposition avec des éléments dynamiques pour avoir un meilleur contrôle du débordement.

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