Как сохранить ярлык в центре WinForms?


137

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

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

Ответы:


281

Set Label«s AutoSizeсвойство False, TextAlignсвойство MiddleCenterи Dockсвойство Fill.


спасибо дециклон, это сработало. Можете ли вы PLZ руководство, что делает Dock?
haansi

3
С помощью Control.Dockсвойства ( msdn.microsoft.com/en-us/library/… ) вы можете прикрепить ( привязать ) элемент управления к определенной стороне контейнера. Так , например Left, Top, Rightили Bottom. Fillговорит элементу управления занять все доступное пространство в контейнере.
дециклон

1
Если вы не хотите, чтобы метка занимала все пространство, доступное для нее, вы можете установить для свойства Dock значение «Нет», как это предложено пользователем 3866622 в его / ее программном решении.
Тим

3
Работал, но мне не нужно было ничего делать с Dockнастройками.
Джим Фелл

4
Dockустановка была ненужной. Изменение AutoSizeсвойства дает метке ограничивающую рамку, размер которой можно вручную настроить.
Ник Робертс

13

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

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

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



10

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

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

2

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

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

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

MyLabel.Left = (this.Width - MyLabel.Width) / 2;

1

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

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

    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 метки в это возвращаемое значение. Это гарантировало, что метка всегда была в центре формы, когда текст изменялся, и перерисовки для полноэкранной формы не были очевидны.


1

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.