2010-05-04 32 views
5

Un ToolStripComboBox se coloca después de un ToolStripButton y está seguido por otro, que está alineado a la derecha. ¿Cómo puedo configurar ToolStripComboBox para que siempre ajuste su longitud para llenar todo el espacio disponible entre el ToolStripButtons anterior y el siguiente?¿Cómo hacer una ToolStripComboBox para llenar todo el espacio disponible en una ToolStrip?

Anteriormente solía manejar un evento de cambio de tamaño principal, calculo la nueva longitud para establecerla en función de las coordenadas de los elementos vecinos y estableciendo el nuevo tamaño. Pero ahora, mientras estoy desarrollando una nueva aplicación, me pregunto si no hay una mejor manera.

Respuesta

1

No hay una opción de diseño automático para esto. Pero puede hacerlo fácilmente implementando el evento ToolStrip.Resize. Esto funcionó bien:

private void toolStrip1_Resize(object sender, EventArgs e) { 
     toolStripComboBox1.Width = toolStripComboBox2.Bounds.Left - toolStripButton1.Bounds.Right - 4; 
    } 
    protected override void OnLoad(EventArgs e) { 
     toolStrip1_Resize(this, e); 
    } 

asegúrese de establecer la propiedad AutoResize del TSCB en False o no va a funcionar.

+0

Aquí va un problema (no recuerdo haberlo tenido en el pasado, cuando estaba usando V2005). En cada significado impar (el efecto no se produce si la diferencia de tamaño es tan pequeña como un par de píxeles) disminución del tamaño desaparecerá una ToolStripComboBox (aparece si la disminuyo una vez más (y desaparecerá nuevamente si la disminuyo una vez más)) o aumentarlo). AutoResize se establece en falso, aumentar un dígito para restar (que es 4 en su ejemplo) no ayudó. La ToolStrip ubicada dentro de un panel SplitContainer se redimensiona cada vez que se cambia el tamaño de un mannel arrastrando el splitter SplitContainer. – Ivan

+0

El caso de ocurrencia más común del patrón de problema que describo es restaurar un formulario desde el estado maximizado; ambos ToolStripComboBoxes (en el panel izquierdo y en el panel derecho) desaparecen en este caso. – Ivan

+0

Para evitar que 'ToolStripComboBox' desaparezca después de cambiar el tamaño del' User Form' del estado maximizado utilicé este truco: 'ToolStripComboBox.Visible = false; ToolStripComboBox.Visible = true; 'dentro del controlador de eventos' toolStrip1_Resize' justo después de 'toolStripComboBox1.Width = ...'. HTH – dee

5

utilizo el siguiente con gran éxito:

private void toolStrip1_Layout(System.Object sender, System.Windows.Forms.LayoutEventArgs e) 
{ 
    int width = toolStrip1.DisplayRectangle.Width; 

    foreach (ToolStripItem tsi in toolStrip1.Items) { 
     if (!(tsi == toolStripComboBox1)) { 
      width -= tsi.Width; 
      width -= tsi.Margin.Horizontal; 
     } 
    } 

    toolStripComboBox1.Width = Math.Max(0, width - toolStripComboBox1.Margin.Horizontal); 
} 

El código anterior no sufre el problema de control disapearing.

+2

Usando VS2010/.NET 4: Si cambio el tamaño del formulario muy rápidamente, sigo teniendo el problema de los controles que desaparecen. Pero se soluciona fácilmente agregando toolStrip1.PerformLayout() en el manejador de eventos de cambio de tamaño del formulario. –

+0

Esto no parece funcionar correctamente cuando se usa una configuración de ppp distinta a 96 ppp. El ancho se escalará después de configurarlo, haciéndolo demasiado grande. – kjbartel

1
ToolStrip ts = new ToolStrip(); 

ToolStripComboBox comboBox = new TooLStripComboBox(); 
comboBox.Dock = DockStyle.Fill; 

ts.LayoutStyle = ToolStripLayoutStyle.Table; 
((TableLayoutSettings)ts.LayoutSettings).ColumnCount = 1; 
((TableLayoutSettings)ts.LayoutSettings).RowCount = 1; 
((TableLayoutSettings)ts.LayoutSettings).SetColumnSpan(comboBox,1); 

ts.Items.Add(comboBox); 

Ahora el cuadro combinado se rellenará correctamente. Establezca el rango de columna o fila en consecuencia.

Cuestiones relacionadas