Как мне сохранить метку в центре WinForms?

В WinForms я использую Label для отображения различных сообщений, таких как успех, неудача и т. Д.

Я хотел бы поместить этот ярлык в центр формы. Мне нужно решение, которое будет держать его в центре внимания, независимо от того, есть ли на этикетке только одно слово или целое предложение.


person haansi    schedule 03.12.2010    source источник


Ответы (7)


Установите свойство Label AutoSize на False, свойство TextAlign на MiddleCenter и свойство Dock на Fill.

person decyclone    schedule 03.12.2010
comment
спасибо дециклону, заработало. Можете ли вы руководствоваться тем, что делает док-станция? - person haansi; 03.12.2010
comment
Со свойством Control.Dock (msdn.microsoft.com/ en-us / library /), вы можете закрепить (прикрепить) элемент управления к определенной стороне контейнера. Например, Left, Top, Right или Bottom. Fill указывает элементу управления занять все доступное пространство в контейнере. - person decyclone; 03.12.2010
comment
Если вы не хотите, чтобы метка заполняла все доступное для нее пространство, вы можете установить для свойства Dock значение None, как было предложено пользователем 3866622 в его / ее программном решении. - person Tim; 07.04.2015
comment
Сработало, но с настройкой Dock ничего делать не пришлось. - person Jim Fell; 20.05.2016
comment
Dock настройка не нужна. Изменение свойства AutoSize дает метке ограничивающую рамку, размер которой можно регулировать вручную. - person Nick Roberts; 04.11.2016
comment
Вместо стыковки можно использовать якоря. - person Robert J; 03.07.2020

Вы добьетесь этого, установив свойство Anchor: None.

person Sebastian Xawery Wiśniowiecki    schedule 03.06.2014

Небольшой дополнительный контент для программной настройки:

Label textLabel = new Label() { 
        AutoSize = false, 
        TextAlign = ContentAlignment.MiddleCenter, 
        Dock = DockStyle.None, 
        Left = 10, 
        Width = myDialog.Width - 10
};            

Выравнивание стиля док-станции и содержимого может отличаться от ваших потребностей. Например, для простой метки в форме wpf я использую DockStyle.None.

person user3866622    schedule 22.07.2014

Если вы не хотите закреплять метку во всей доступной области, просто установите событие SizeChanged вместо TextChanged. Изменение каждой буквы приведет к изменению свойства ширины метки, а также ее текста, если для свойства autosize установлено значение True. Так что, кстати, вы можете использовать любую формулу, чтобы метка оставалась центрированной по форме.

private void lblReport_SizeChanged(object sender, EventArgs e)
{
    lblReport.Left = (this.ClientSize.Width - lblReport.Size.Width) / 2;
}
person Umut OVECOGLU    schedule 12.05.2015

Принятый ответ у меня не сработал по двум причинам:

  1. Я установил BackColor, поэтому установка AutoSize = false и Dock = Fill заставляет цвет фона заполнять всю форму
  2. Я все равно не мог установить AutoSize в значение false, потому что текст моей метки был динамическим

Вместо этого я просто использовал ширину формы и ширину метки для вычисления левого смещения:

MyLabel.Left = (this.Width - MyLabel.Width) / 2;
person TheIronCheek    schedule 20.08.2019

Я хотел сделать что-то подобное, но в форме с фоновым изображением я обнаружил, что когда текст в метке изменился, перерисовка была очевидна с помощью этого метода, поэтому я сделал следующее: * Установите для метки AutoSize значение true, а TextAlign - Средний центр

Затем каждый раз, когда текст менялся (мой был сделан с использованием таймера), я вызывал следующий метод:

    private Point GetPosition()
    {
        int y = (this.Height / 2) - (label1.Height / 2);
        int x = (this.Width / 2) - (label1.Width / 2);
        return new Point(x, y);
    }

И установите для свойства Location метки это возвращаемое значение. Это гарантировало, что метка всегда была в центре формы, когда текст менялся, а перерисовка полноэкранной формы не была очевидна.

person LordPupazz    schedule 30.01.2019

Вы можете попробовать следующий фрагмент кода:

private Point CenterOfMenuPanel<T>(T control, int height=0) where T:Control {
    Point center = new Point( 
        MenuPanel.Size.Width / 2 - control.Width * 2,
        height != 0 ? height : MenuPanel.Size.Height / 2 - control.Height / 2);

    return center;
}

Это действительно центр

введите описание изображения здесь

person Minwoo Yu    schedule 12.09.2019