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