2010-06-23 40 views
7

De manera predeterminada, los elementos en el cuadro combinado C# se dejan alineados. ¿Hay alguna opción disponible para cambiar esta justificación aparte de anular el método DrawItem y establecer el modo de dibujo combobox -> DrawMode.OwnerDrawFixed?Combobox justificado a la derecha en C#

Saludos

+0

Agregué la etiqueta winforms a su pregunta ya que supongo que por el hecho de que usted mencionó DrawItem no se está refiriendo a WPF. Sin embargo, esto realmente no tiene nada que ver con C#, pero no quería eliminar una etiqueta. – Josh

+0

Gracias por etiquetarlo –

Respuesta

2

en WPF esto sería tan fácil como la especificación de una ItemContainerStyle. En Windows Forms, es un poco más complicado. Sin un dibujo personalizado, podría establecer la propiedad RightToLeft en el ComboBox, pero esto también afectaría desafortunadamente al botón desplegable.

Dado que Windows Forms usa un ComboBox nativo y Windows no tiene un estilo ComboBox como ES_RIGHT que afecta la alineación del texto, creo que su única opción es recurrir al sorteo del propietario. Probablemente sería una buena idea derivar una clase de ComboBox y agregar una propiedad TextAlignment o algo así. Entonces solo aplicarías tu dibujo si TextAlignment estuviese centrado o alineado a la derecha.

+0

Hola ... En este caso, ¿cómo aplico TextAlignment al control? ¿Estás insinuando el formato de cadena aquí? –

+0

No, digo que necesitaría crear un control que proceda de ComboBox y agregar una propiedad * nueva * llamada TextAlignment. Luego, en su método OnDrawItem puede tomar esta propiedad en cuenta, en lugar de codificar una alineación. – Josh

+0

Ejemplo: http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.drawitem.aspx – Josh

4

Puedes simplemente establecer el estilo de control en RightToLeft = RightToLeft.Yes si no te molesta el widget de soltar en el otro lado también.

o

conjunto DrawMode = OwnerDrawFixed; y enlazar el evento DrawItem, entonces algo así como

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index == -1) 
      return; 
     ComboBox combo = ((ComboBox) sender); 
     using (SolidBrush brush = new SolidBrush(e.ForeColor)) 
     { 
      e.DrawBackground(); 
      e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, brush, e.Bounds, new StringFormat(StringFormatFlags.DirectionRightToLeft)); 
      e.DrawFocusRectangle(); 
     } 
    } 
+0

Hola ... No hay diferencia que pueda ver incluso después de implementar este manejador. –

+0

no estoy seguro de por qué, ¿recordó establecer la propiedad del cuadro combinado DrawMode en OwnerDrawFixed. Y tienes algunos elementos en la lista. – Paul

+0

¡Funciona muy bien para mí! – Dan

0

Usted debe "DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed" y su propio método de sorteo como esta.

protected virtual void OnDrawItem(object sender, DrawItemEventArgs e) 
{ 
    var comboBox = sender as ComboBox; 

    if (comboBox == null) 
    { 
     return; 
    } 

    e.DrawBackground(); 

    if (e.Index >= 0) 
    { 
     StringFormat sf = new StringFormat(); 
     sf.LineAlignment = StringAlignment.Center; 
     sf.Alignment = StringAlignment.Center; 

     Brush brush = new SolidBrush(comboBox.ForeColor); 

     if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
     { 
      brush = SystemBrushes.HighlightText; 
     } 

     e.Graphics.DrawString(comboBox.Items[e.Index].ToString(), comboBox.Font, brush, e.Bounds, sf); 
    } 
} 
Cuestiones relacionadas