Cambiar el comportamiento de desbordamiento de ToolStripPanel para ToolStripItems agregados dinámicamente

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

Pregunta

Tengo un Windows Forms ToolStripPanel en el que le agrego dinámicamente nuevos ToolStrips. Cada ToolStrip tiene ToolStripItems que agrego dinámicamente (en su mayoría ToolStripButtons).

Me gustaría que todos los ToolStrips encajen en una fila siempre que pueda ver todos los ToolStripItems en cada ToolStrip. Si agregar un nuevo ToolStripItem a un ToolStrip causa un desbordamiento, me gustaría que el ToolStrip al final de la fila salte a una nueva fila. La única vez que me gustaría ver el botón de desbordamiento es si el ToolStrip tiene tantos elementos que no pueden caber en el ancho del formulario.

Quiero que este sea el comportamiento predeterminado a menos que un usuario mueva manualmente un ToolStrip. Si el usuario mueve el ToolStrip, quiero que se produzca el comportamiento de desbordamiento existente (por ejemplo, botón de desbordamiento con opciones desplegables). Supongo que el usuario estará de acuerdo con este comportamiento de desbordamiento de Winforms predeterminado si posicionan la barra de herramientas ellos mismos.

Si se agrega una nueva barra de herramientas dinámica después de que el usuario reposiciona las cosas, me gustaría que la nueva barra de herramientas se agregue a la derecha del último ToolStrip en la fila inferior. Esta barra de herramientas debe tener el comportamiento de desbordamiento actualizado (por ejemplo, usar una nueva fila si no puede encajar) hasta que el usuario la vuelva a colocar manualmente.

He investigado un poco sin mucho éxito:

  • Esto parece que debería ser una simple cuestión de cambiar un ToolStripLayoutStyle , pero este no parece ser el caso. (En el mejor de los casos, las nuevas filas se crean cuando el botón de desbordamiento se muestra en todos los ToolStrips en una fila dada).
  • El artículo de MSDN " Cómo: Administrar ToolStrip Desbordamiento en Windows Forms " parece cubrir solo si / cuando ocurre el botón de desbordamiento.
  • Hay un LayoutCompleted Evento en el ToolStrip que parece posible usar para modificar las cosas, parece que debería haber una manera más fácil.
  • Crear un LayoutEngine personalizado parece una exageración para esto, ya que el integrado está muy cerca de lo que quiero hacer.

¿Me falta una solución fácil?

ACTUALIZACIÓN: Sigo buscando una buena solución. Parece que la ruta LayoutCompleted es posible. El problema con esto es que se llama varias veces. Una vez dice que el ToolStripItem está en el área de desbordamiento e inmediatamente después está en el área Principal, por lo que no parece seguro verificar solo una vez si está desbordado.

¿Fue útil?

Solución 2

Al final, no creo que haya una buena solución fácil. Este hilo deja claro que los ToolStrips no fueron realmente diseñados para escenarios dinámicos como una prioridad.

Un enfoque único es establecer el ToolStrip MinimumSize para ser el tamaño de todos los botones. Esto comenzará a funcionar con un desbordamiento como lo describo, pero incluso esto tiene problemas con los casos de borde.

El mejor enfoque que he encontrado es hacer todo lo posible para tener una idea del tamaño de la barra de herramientas por adelantado y luego colocarlo en el ToolStripPanel usando Join . Si realiza una estimación razonable antes de tiempo, es probable que esté bien si agrega más botones más adelante, ya que terminarán en el área de desbordamiento.

Otros consejos

1) Añade los elementos a la barra de herramientas

2) Compara el ancho de la barra de herramientas con la cantidad de espacio que queda en la última fila. ToolStripPanel tiene una propiedad Rows [] que le dirá qué es la última fila y qué tiras de herramientas hay en esa fila. Sume sus anchos y restájalos del ancho del panel.

3) Agregue la nueva barra de herramientas al panel utilizando el método Unir, especificando la última fila (si corresponde) o una fila más alta (si no es así).

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