user-interface visual-studio-2005 .net-2.0 toolstrip toolstrippanel

user interface - Tratando de agregar una ToolStrip a ToolStripPanel lado a lado con una ToolStrip existente



user-interface visual-studio-2005 (3)

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

Entonces el LayoutEngine personalizado establece las 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 llevó un tiempo es que cambiar la ubicación / tamaño de un elemento ToolStrip causará que el diseño vuelva a dispararse, con los controles reordenados. Así que tomo una copia de los controles antes del ciclo de diseño. Y no puede usar AddRange (...) para agregar elementos al Panel personalizado por alguna razón; necesita agregarlos (...) de uno en uno.

Espero que ayude (se basa en MSDN LayoutEngine Example , corregido para ToolStripPanels)

Wyzfen

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, de modo que aparezcan una al lado de la otra. Quiero que sea como Word 2003, donde puedes agregar varias 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é a la parte superior del formulario (no utilicé ToolStripContainer porque no necesito todos los paneles adicionales, solo necesito uno en la parte superior). Agregué ambas tiras de herramientas y establecí sus propiedades de Estiramiento en Falso. Puedo hacer que aparezcan en la ventana del diseñador uno al lado del otro, pero en el tiempo de ejecución el ToolStripPanel separa las tiras de herramientas y le da a cada tira de herramientas su propia fila dedicada. Como para agregar un insulto a la lesión, cuando dejo de depurar y regreso al diseñador, ¡me doy cuenta de 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 ni nada de eso), todo tiene una propiedad Controls () que devuelve una matriz de objetos de control, y no he tenido mucha suerte tratando de agregar elementos a esa matriz. También encontré documentación sobre el método ToolStripPanel.Join, que suena como que debería hacer el trabajo, así que probé las 3 sobrecargas pero no funcionan como se anuncia. No importa lo que haga o las opciones que pruebo, siempre agrega la nueva tira de herramientas a la parte superior del panel en su propia fila y empuja todo lo demás hacia abajo.

En aras de una divulgación completa, debo advertirle que tengo el ToolStripPanel y una de las tiras de herramientas añadidas a un formulario de clase base, y estoy tratando de agregar la otra tira de herramientas a una forma de subclase que hereda de la forma de la clase base. ToolStripPanel y ToolStrip en la forma de baseclass son ambos declarados "Amigo Protegido", así que esto debería estar funcionando. Como mencioné, la ventana de diseñador de la forma de 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 muy agradecido.


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

Simplemente coloque los controles ToolStrip en el orden correcto.


Creo que en su caso puede salirse con la suya simplemente configurando LayoutStyle en su ToolStrip a ToolStripLayoutStyle.HorizontalStackWithOverflow en lugar de tener su propio LayoutEngine personalizado.

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.