Выпадающий список с выравниванием по правому краю в C#

#c# #.net #winforms #combobox #text-alignment

#c# #.net #winforms #выпадающий список #выравнивание текста

Вопрос:

По умолчанию элементы в выпадающем списке C # выровнены по левому краю. Существуют ли какие-либо доступные опции для изменения этого выравнивания, кроме переопределения метода DrawItem и установки combobox drawmode -> DrawMode.OwnerDrawFixed?

Приветствия

Комментарии:

1. Я добавил тег winforms к вашему вопросу, поскольку из того факта, что вы упомянули DrawItem, я предполагаю, что вы не имеете в виду WPF. На самом деле это не имеет никакого отношения к C #, но я не хотел удалять тег.

Ответ №1:

Вы могли бы просто установить стиль управления на 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();
        }
    }
  

Комментарии:

1. Привет… Я не вижу никакой разницы даже после того, как внедрил этот обработчик.

2. не уверен, почему, вы не забыли установить для свойства поля со списком DrawMode значение OwnerDrawFixed. И есть ли у вас какие-то элементы в списке.

Ответ №2:

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

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

Комментарии:

1. Привет… В этом случае как мне применить выравнивание текста к элементу управления? Вы намекаете здесь на формат строки?

2. Нет, я говорю, что вам нужно было бы создать элемент управления, производный от ComboBox, и добавить новое свойство под названием textAlignment . Затем в вашем методе OnDrawItem вы можете учитывать это свойство, а не жестко кодировать выравнивание.

3. Пример: msdn.microsoft.com/en-us/library /…

Ответ №3:

Вы должны «нарисовать режим = System.Windows.Формы.Режим рисования.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 amp; DrawItemState.Selected) == DrawItemState.Selected)
        {
            brush = SystemBrushes.HighlightText;
        }

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