Pregunta

Estoy usando .net 2.0 con Visual Studio 2005 y estoy tratando de agregar dos tiras de herramientas diferentes en la parte superior del formulario para que aparezcan lado a lado. Quiero que sea como Word 2003, donde puedes agregar múltiples tiras de herramientas a la misma fila y hacer que aparezcan alineadas entre sí, en lugar de dedicar una fila a cada tira de herramientas.

Así que agregué un ToolStripPanel y lo acoplé en la parte superior del formulario (no usé un ToolStripContainer porque no necesito todos los paneles adicionales; solo necesito uno en la parte superior). Agregué ambas tiras de herramientas y configuré sus propiedades de Estiramiento en Falso. Puedo hacer que aparezcan en la ventana del diseñador de lado a lado, pero en el tiempo de ejecución, ToolStripPanel separa las herramientas y le da a cada barra de herramientas su propia fila dedicada. Como para agregar insulto a la lesión, cuando dejo de depurar y vuelvo al diseñador, ¡encuentro que el diseñador está moviendo las tiras de herramientas a su propia fila también! ¿Estoy haciendo algo mal aquí?

He estado buscando en Google todo el día y encontré información sobre un objeto ToolStripPanelRow, pero no veo una manera fácil de agregarle herramientas (es decir, no tiene un método ToolStripPanelRow.Controls.Add o algo así) ), todo lo que tiene es una propiedad de Controls () que devuelve una matriz de objetos de control, y no he tenido mucha suerte al intentar agregar elementos a esa matriz. También encontré algo de documentación sobre el método ToolStripPanel.Join, que parece que debería funcionar, así que probé las 3 sobrecargas pero no funcionan como se anuncia. Independientemente de lo que haga o de las opciones que pruebe, siempre agrega la nueva barra de herramientas a la parte superior del panel en su propia fila y empuja todo lo demás hacia abajo.

En el interés de la divulgación completa, debo advertirle que tengo ToolStripPanel y una de las herramientas de herramientas agregadas a un formulario de clase de base, y estoy tratando de agregar la otra barra de herramientas a un formulario de subclase que hereda de la forma de clase de base. El ToolStripPanel y ToolStrip en la forma de clase de base se declaran "Amigo Protegido", por lo que esto debería estar funcionando. Como mencioné, la ventana del diseñador de la forma subclase me permitirá hacerlo (al menos, por un tiempo).

Si alguien puede ayudarme a hacer que esto funcione o al menos arrojar algo de luz sobre por qué no lo está, estaría extremadamente agradecido.

¿Fue útil?

Solución

Creé un ToolStripPanel personalizado para poder sobrecargar el 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;
    }
  }
}

Luego, el LayoutEngine personalizado presenta los 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 que tomó un tiempo es que cambiar la ubicación / tamaño de un elemento ToolStrip hará que el diseño se vuelva a disparar, con los controles reordenados. Así que tomo una copia de los controles antes del bucle de diseño. Y no puede usar AddRange (...) para agregar elementos al Panel personalizado por alguna razón, debe agregarlos (...) uno por uno.

espero que ayude (se basa en Ejemplo de MSDN LayoutEngine , corregido para ToolStripPanels)

Wyzfen

Otros consejos

System.Windows.Forms.FlowLayoutPanel puede hacer el trabajo.

Simplemente coloque los controles ToolStrip en el orden correcto.

Creo que en tu caso puedes salirte con solo configurar LaytyStyle en tu ToolStrip en ToolStripLayoutStyle.HorizontalStackWithOverflow en lugar de necesitar tu propio LayoutEngine personalizado.

Le hice una pregunta diferente sobre un tema similar sobre cómo manejar el diseño con elementos dinámicos para tener un mejor control del desbordamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top