Ответ 1
Автоматические размеры ComboBox для соответствия шрифту. Отключение это не вариант. Если вы хотите, чтобы он был больше, то придайте ему более крупный шрифт.
У меня есть ComboBox в форме, а его высота по умолчанию - 21. Как мне его изменить?
Автоматические размеры ComboBox для соответствия шрифту. Отключение это не вариант. Если вы хотите, чтобы он был больше, то придайте ему более крупный шрифт.
Установите DrawMode
на OwnerDrawVariable
. Однако настройка ComboBox приводит к другим проблемам. См. Эту ссылку для учебника о том, как это сделать полностью:
http://www.csharphelp.com/2006/09/listbox-control-in-c/
OwnerDrawVariable
пример кода здесь:
https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.drawitem%28v=vs.110%29.aspx
После этого вам нужно установить свойство ItemHeight
в поле со списком, чтобы установить эффективную высоту выпадающего списка.
Как еще один вариант, если вы хотите увеличить высоту ComboBox
без увеличения размера шрифта или беспокоиться о том, чтобы рисовать все самостоятельно, вы можете использовать простой вызов API Win32, чтобы увеличить высоту, подобную этой
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Win32ComboBoxHeightExample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
private const Int32 CB_SETITEMHEIGHT = 0x153;
private void SetComboBoxHeight(IntPtr comboBoxHandle, Int32 comboBoxDesiredHeight)
{
SendMessage(comboBoxHandle, CB_SETITEMHEIGHT, -1, comboBoxDesiredHeight);
}
private void button1_Click(object sender, EventArgs e)
{
SetComboBoxHeight(comboBox1.Handle, 150);
comboBox1.Refresh();
}
}
}
Результат:
Для этого вам нужно установить DrawMode
в OwnerDrawVariable
или OwnerDrawFixed
и вручную рисовать ваши элементы. Это можно сделать с помощью довольно простого класса.
Этот пример позволит вам использовать свойство ItemHeight
ComboBox независимо от размера шрифта. Я TextAlign
бонусное свойство TextAlign
которое также позволит вам TextAlign
элементы.
Стоит отметить, что вы должны установить DropDownStyle
в DropDownList
для выбранного элемента, чтобы соответствовать нашим настройкам.
// The standard combo box height is determined by the font. This means, if you want a large text box, you must use a large font.
// In our class, ItemHeight will now determine the height of the combobox with no respect to the combobox font.
// TextAlign can be used to align the text in the ComboBox
class UKComboBox : ComboBox
{
private StringAlignment _textAlign = StringAlignment.Center;
[Description("String Alignment")]
[Category("CustomFonts")]
[DefaultValue(typeof(StringAlignment))]
public StringAlignment TextAlign
{
get { return _textAlign; }
set
{
_textAlign = value;
}
}
private int _textYOffset = 0;
[Description("When using a non-centered TextAlign, you may want to use TextYOffset to manually center the Item text.")]
[Category("CustomFonts")]
[DefaultValue(typeof(int))]
public int TextYOffset
{
get { return _textYOffset; }
set
{
_textYOffset = value;
}
}
public UKComboBox()
{
// Set OwnerDrawVariable to indicate we will manually draw all elements.
this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
// DropDownList style required for selected item to respect our DrawItem customizations.
this.DropDownStyle = ComboBoxStyle.DropDownList;
// Hook into our DrawItem & MeasureItem events
this.DrawItem +=
new DrawItemEventHandler(ComboBox_DrawItem);
this.MeasureItem +=
new MeasureItemEventHandler(ComboBox_MeasureItem);
}
// Allow Combo Box to center aligned and manually draw our items
private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
// Draw the background
e.DrawBackground();
// Draw the items
if (e.Index >= 0)
{
// Set the string format to our desired format (Center, Near, Far)
StringFormat sf = new StringFormat();
sf.LineAlignment = _textAlign;
sf.Alignment = _textAlign;
// Set the brush the same as our ForeColour
Brush brush = new SolidBrush(this.ForeColor);
// If this item is selected, draw the highlight
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
brush = SystemBrushes.HighlightText;
// Draw our string including our offset.
e.Graphics.DrawString(this.Items[e.Index].ToString(), this.Font, brush,
new RectangleF(e.Bounds.X, e.Bounds.Y + _textYOffset, e.Bounds.Width, e.Bounds.Height), sf);
}
}
// If you set the Draw property to DrawMode.OwnerDrawVariable,
// you must handle the MeasureItem event. This event handler
// will set the height and width of each item before it is drawn.
private void ComboBox_MeasureItem(object sender,System.Windows.Forms.MeasureItemEventArgs e)
{
// Custom heights per item index can be done here.
}
}
Теперь у нас есть полный контроль над нашим шрифтом и высотой ComboBox отдельно. Нам больше не нужно делать большой шрифт для размера нашего ComboBox.
Если вы хотите настроить количество элементов в ComboBox, вы можете изменить значение DropDownHeight следующим образом, учитывая список элементов. Я использую 24 здесь как "количество штук"; это отнюдь не фиксировано.
comboBox1.DropDownHeight = SomeList.Count * 24;
ComboBox имеет свойство DropDownHeight, которое можно изменить либо через окно свойств комбинированного списка, либо программно. т.е.
public partial class EventTestForm : Form
{
public EventTestForm()
{
InitializeComponent();
cmbOwners.DropDownHeight = 100;
}
В коде, a.Height должен работать. В дизайнере зайдите в свойства и посмотрите в Size- > Height.
В качестве альтернативы вы можете изменить размер шрифта, и поле со списком станет больше, чтобы разместить его, но я не думаю, что вы хотите.