Выравнивание по правому краю в C # - PullRequest
7 голосов
/ 23 июня 2010

По умолчанию элементы в C # Combobox выровнены по левому краю. Есть ли варианты для изменения этого выравнивания, кроме переопределения метода DrawItem и установки режима рисования в выпадающем списке -> DrawMode.OwnerDrawFixed?

Приветствия

Ответы [ 3 ]

4 голосов
/ 23 июня 2010

Вы можете просто установить стиль управления на RightToLeft = RightToLeft.Yes, если не обращаете внимания и на виджет перетаскивания с другой стороны.

или

установить DrawMode = OwnerDrawFixed; и подключитьDrawItem событие, то что-то вроде

    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();
        }
    }
2 голосов
/ 23 июня 2010

В WPF это будет так же просто, как указать ItemContainerStyle.В Windows Forms это немного сложнее.Без пользовательского рисования вы можете установить свойство RightToLeft в ComboBox, но это, к сожалению, также повлияет на кнопку выпадающего меню.

Поскольку Windows Forms использует собственный ComboBox, а в Windows нет стиля ComboBox, например ES_RIGHT , который влияет на выравнивание текста, я думаю, что ваш единственный вариант - прибегнуть к рисованию владельца.Вероятно, было бы неплохо извлечь класс из ComboBox и добавить свойство TextAlignment или что-то еще.Тогда вы примените свой чертеж только в том случае, если TextAlignment было отцентрировано или выровнено по правому краю.

1 голос
/ 04 июля 2015

Вы должны "DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed" и свой собственный метод рисования, как этот.

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