2010-06-23 9 views
7

Standardmäßig sind die Elemente in der C# Combobox linksbündig. Gibt es Optionen, um diese Einstellung zu ändern, abgesehen von der Überschreibung der DrawItem-Methode und der Einstellung der Combobox drawmode -> DrawMode.OwnerDrawFixed?Rechtsbündiges Kombinationsfeld in C#

Prost

+0

Ich habe Winforms-Tag zu Ihrer Frage hinzugefügt, da ich davon ausgehe, dass Sie DrawItem erwähnt haben, dass Sie sich nicht auf WPF beziehen. Das hat zwar nicht wirklich etwas mit C# zu tun, aber ich wollte kein Tag entfernen. – Josh

+0

Vielen Dank für die Markierung –

Antwort

2

In WPF würde dies so einfach sein wie eine ItemContainerStyle angeben. In Windows Forms ist es ein wenig komplizierter. Ohne benutzerdefinierte Zeichnung könnten Sie die RightToLeft -Eigenschaft auf der ComboBox festlegen, aber dies würde sich leider auch auf die Dropdown-Schaltfläche auswirken.

Da Windows Forms eine native ComboBox verwendet und Windows keinen ComboBox-Stil wie ES_RIGHT hat, der sich auf die Textausrichtung auswirkt, denke ich, dass Sie nur auf die Eigentümerzeichnung zurückgreifen können. Es wäre wahrscheinlich eine gute Idee, eine Klasse von ComboBox abzuleiten und eine TextAlignment-Eigenschaft oder etwas hinzuzufügen. Dann würden Sie Ihre Zeichnung nur anwenden, wenn TextAlignment zentriert oder rechts ausgerichtet ist.

+0

Hallo ... In diesem Fall wie verwende ich die TextAlignment auf das Steuerelement? Droht Ihnen hier das String-Format? –

+0

Nein Ich sage, dass Sie ein Steuerelement erstellen müssen, das von ComboBox abgeleitet wird und eine * neue * Eigenschaft namens TextAlignment hinzufügt. Dann können Sie diese Eigenschaft in Ihrer OnDrawItem-Methode berücksichtigen, anstatt eine Ausrichtung hart zu codieren. – Josh

+0

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

4

Sie können den Steuerungsstil einfach auf RightToLeft = RightToLeft.Yes setzen, wenn Sie das Drop-Widget auf der anderen Seite nicht stören.

oder

gesetzt DrawMode = OwnerDrawFixed; und haken Sie das DrawItem Ereignis, dann so etwas wie

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

Hi ... Es gibt keinen Unterschied, den ich sehen kann, nachdem ich diesen Handler implementiert habe. –

+0

nicht sicher, warum, haben Sie daran gedacht, die Eigenschaft des Kombinationsfeldes DrawMode auf OwnerDrawFixed zu setzen. Und haben Sie einige Gegenstände in der Liste? – Paul

+0

Funktioniert gut für mich! – Dan

0

Sie müssen "DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed" und Ihre eigene Zeichenmethode wie Dies.

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