Domanda

Sto usando .net 2.0 con Visual Studio 2005 e sto provando ad aggiungere due diverse toolstrip nella parte superiore del modulo in modo che vengano visualizzate fianco a fianco. Voglio che sia come Word 2003, in cui è possibile aggiungere più toolstrip alla stessa riga e farle apparire allineate tra loro, anziché dedicare una riga a ciascuna toolstrip.

Quindi ho aggiunto uno ToolStripPanel e l'ho ancorato nella parte superiore del modulo (non ho usato uno ToolStripContainer perché non ho bisogno di tutti i pannelli extra; ho solo bisogno di quello in alto). Ho aggiunto entrambe le strisce degli strumenti e ho impostato le proprietà di stiramento su False. Posso farli comparire nella finestra del progettista fianco a fianco, ma in fase di esecuzione ToolStripPanel separa le strisce degli strumenti e dà a ciascuna barra degli strumenti la propria riga dedicata. Come per aggiungere un insulto a un infortunio, quando smetto di eseguire il debug e torno dal designer, sto scoprendo che anche il designer sta spostando le strisce degli strumenti nella propria riga! Sto facendo qualcosa di sbagliato qui?

Sono stato su Google tutto il giorno e ho trovato alcune informazioni su un oggetto ToolStripPanelRow, ma non vedo un modo semplice per aggiungere toolstrip ad esso (cioè non ha un metodo ToolStripPanelRow.Controls.Add o qualcosa del genere ), tutto ciò che ha è una proprietà Controls () che restituisce una matrice di oggetti di controllo e non ho avuto molta fortuna nel provare ad aggiungere elementi a quella matrice. Ho anche trovato della documentazione sul metodo ToolStripPanel.Join, che sembra che dovrebbe fare il lavoro, quindi ho provato tutti e 3 i sovraccarichi ma non funzionano come pubblicizzato. Indipendentemente da ciò che faccio o dalle opzioni che provo, aggiunge sempre la nuova sequenza comandi nella parte superiore del pannello sulla propria riga e spinge tutto il resto verso il basso.

Nell'interesse di una completa divulgazione, dovrei avvertirti che ho ToolStripPanel e una delle toolstrip aggiunte a un modulo di base, e sto cercando di aggiungere l'altra toolstrip a un modulo di sottoclasse che eredita dal modulo di baseclass. ToolStripPanel e ToolStrip nel modulo di base sono entrambi dichiarati "Protected Friend", quindi dovrebbe funzionare. Come ho già detto, la finestra di progettazione del modulo della sottoclasse mi permetterà di farlo (almeno, per un po ').

Se qualcuno mi può aiutare a farlo funzionare o almeno far luce sul perché non lo è, sarei estremamente grato.

È stato utile?

Soluzione

Ho creato un ToolStripPanel personalizzato per sovraccaricare 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;
    }
  }
}

Quindi il LayoutEngine personalizzato delinea le ToolStrips;

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

Una cosa che ha richiesto un po 'di tempo è che la modifica della posizione / dimensione di un elemento ToolStrip provocherà il riutilizzo del layout, con i comandi riordinati. Quindi prendo una copia dei controlli prima del ciclo di layout. E non puoi usare AddRange (...) per aggiungere elementi al Pannello personalizzato per qualche motivo - devi aggiungerli (...) uno alla volta.

spero che sia d'aiuto (si basa su Esempio di layout del motore MSDN , risolto per ToolStripPanels)

Wyzfen

Altri suggerimenti

System.Windows.Forms.FlowLayoutPanel può fare il lavoro.

Basta inserire i controlli ToolStrip in esso nell'ordine corretto.

Penso che nel tuo caso tu possa cavartela semplicemente impostando LayoutStyle su ToolStrip su ToolStripLayoutStyle.HorizontalStackWithOverflow piuttosto che avere bisogno del tuo LayoutEngine personalizzato.

Ho fatto una una domanda diversa su un argomento simile su come gestire il layout con elementi dinamici per avere un migliore controllo dell'overflow.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top