Центрирование элементов управления в форме в.NET (Winforms)?
Я пытаюсь центрировать фиксированный размер управления в форме.
Из интереса, есть ли неидиотский способ сделать это? Что мне действительно нужно, так это нечто аналогичное свойству text-align css.
На данный момент я устанавливаю свойство padding окружающей формы подходящего размера и задаю свойство Dock элемента управления для заполнения.
11 ответов
Вы могли бы достичь этого с помощью якорей. Или, точнее, не использовать их.
Элементы управления по умолчанию привязаны к верхнему левому углу формы, что означает, что при изменении размера формы их расстояние от верхнего левого края формы будет оставаться постоянным. Если вы измените привязку элемента управления слева внизу, тогда элемент управления будет сохранять одинаковое расстояние от нижней и левой сторон формы при изменении размера формы.
Отключение якоря в направлении удерживает центр управления в этом направлении при изменении размера.
ПРИМЕЧАНИЕ. Для отключения привязки через окно свойств в VS2015 может потребоваться ввести "Нет", "Нет" (вместо значений по умолчанию "Вверх", "Влево").
myControl.Left = (this.ClientSize.Width - myControl.Width) / 2 ;
myControl.Top = (this.ClientSize.Height - myControl.Height) / 2;
Поскольку вы не указываете, может ли форма изменить размер или нет, существует простой способ, если вам не нужно изменять размер (если вам все равно, используйте решение Mitch Wheats):
Выберите элемент управления -> Формат (опция меню) -> Центр в окне -> По горизонтали или по вертикали
Я нашел отличный способ сделать это, и он будет работать с несколькими элементами управления. Добавьте TableLayout с 3 столбцами. Сделайте центральную колонку абсолютного размера (сколько вам нужно места). Установите два внешних столбца на 100%. Добавьте панель в центральный столбец, добавьте все необходимые элементы управления и разместите их в нужном месте. Эта центральная панель теперь будет оставаться в центре вашей формы.
Для центрирования кнопки на панели o в другом контейнере выполните следующие действия:
- Во время разработки установите позицию
- Перейдите в свойства " Якорь кнопки" и установите это значение как на следующем рисунке.
Кроме того, если вы хотите выровнять его по центру другого элемента управления:
//The "ctrlParent" is the one on which you want to align "ctrlToCenter".
//"ctrlParent" can be your "form name" or any other control such as "grid name" and etc.
ctrlToCenter.Parent = ctrlParent;
ctrlToCenter.Left = (ctrlToCenter.Parent.Width - ctrlToCenter.Width) / 2;
ctrlToCenter.Top = (ctrlToCenter.Parent.Height - ctrlToCenter.Height) / 2;
Вы можете поместить элемент управления, который вы хотите центрировать внутри Panel, и установить для левого и правого значений заполнения значение, большее, чем значение по умолчанию. Пока они равны и ваш контроль привязан к сторонам панели, он будет отображаться по центру этой панели. Затем вы можете привязать Panel контейнера к его родителю по мере необходимости.
Вы можете поместить все свои элементы управления на панель, а затем написать код, чтобы переместить панель в центр формы.
panelMain.Location =
new Point(ClientSize.Width / 2 - panelMain.Size.Width / 2,
ClientSize.Height / 2 - panelMain.Size.Height / 2);
panelMain.Anchor = AnchorStyles.None;
Это предполагает наглядность (ну, я полагаю, вы могли бы достать калькулятор и рассчитать), но просто вставьте указанный элемент управления в форму и затем удалите любую привязку (anchor = None).
Чтобы элемент управления оставался центрированным, даже размер формы или родительского элемента управления был изменен.
- Установите следующие свойства родительского элемента (вы можете установить их через окно свойств ):
parentControl.AutoSize = true;
parentControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
- Поместите этот код в событие Resize формы или родительского элемента управления (если элемент управления находится внутри другого элемента управления) .
controlToCenter.Left = (parentControl.Width- controlToCenter.Width) / 2;
controlToCenter.Top = (parentControl.Height - controlToCenter.Height) / 2;
- Если родительский элемент управления прикреплен к форме, добавьте эту строку кода.
//adjust this based on the layout of your form
parentControl.Height = this.ClientSize.Height;
Итак, в настоящее время я работаю над контролем нумерации страниц, и я придумал следующее, чтобы достичь результата, указанного ниже.
- Добавьте PanelLayout в свой контейнер (например, форму или пользовательское управление)
- Задайте свойства PanelLayout:
- Док: снизу (или сверху)
- AutoSize: False
Это центрирует PanelLayout по горизонтали. Теперь, в вашем коде, сделайте что-то вроде этого:
public MyConstructor()
{
InitializeComponent();
for (var i = 0; i<10; i++)
{
AddButton(i);
}
}
void AddButton(int i)
{
var btn = new Button();
btn.Width = 30;
btn.Height = 26;
btn.Text = i.ToString();
this.flowLayoutPanel1.Controls.Add(btn);
btn.Anchor = AnchorStyles.None;
}
Однако есть праздник. Если я сделаю свою форму маленькими (по горизонтали) кнопками, они «исчезнут» за пределами области просмотра. В моем случае это не проблема, но вы можете позаботиться об этом, написав код, который прослушивает событие Resize и удаляет элементы (кнопки) в зависимости от ширины окна просмотра.