Как центрировать окно на экране в С#?

Мне нужен способ центрировать текущее окно. Так, например, если пользователь нажимает кнопку, я хочу, чтобы окно центрировалось на экране. Я знаю, что вы можете использовать свойство startposition, но я не могу понять, как его использовать, кроме как при первом запуске приложения. Итак, как мне центрировать форму на экране?


person Sean    schedule 05.01.2011    source источник
comment
Я полагаю, вы используете формы победы?   -  person Andrew Orsich    schedule 05.01.2011
comment
Не используйте Form.CenterToScreen. См. >этот пост для подробностей.   -  person Artemix    schedule 07.02.2013
comment
используйте метод CenterToScreen() в конструкторе класса формы.   -  person webMac    schedule 28.03.2018


Ответы (13)


Используйте метод Form.CenterToScreen().

person dzendras    schedule 05.01.2011
comment
В системе с двумя мониторами форма будет центрирована на том, на котором в данный момент находится курсор. Таким образом, форма может внезапно перейти на другой монитор. См. сообщение здесь. - person Artemix; 07.02.2013
comment
В документации, на которую вы ссылаетесь, говорится: «Не вызывайте это напрямую из кода». хотя не сказано почему. - person Stephen Turner; 09.06.2014
comment
В документации сказано, что для центрирования следует использовать свойство формы StartPosition. Это сработало для меня. - person John Kroetch; 19.08.2014
comment
Это работает, мне просто нужно было создать экземпляр: this.CenterToScreen(); - person Laki Politis; 21.07.2017
comment
Я также хотел бы знать, почему в документации написано Не вызывать это непосредственно из вашего кода. - person Pete; 13.05.2019
comment
Это не сработает, если разместить его после этой строки кода: this.Location = Screen.AllScreens[0].WorkingArea.Location; - person TK-421; 31.07.2019

  1. Использование окна Свойства

    Выберите форму → перейдите в окно свойств → выберите «начальное положение» → выберите любое место, которое вы хотите.

  2. Программно

    Form form1 = new Form(); form1.StartPosition = FormStartPosition.CenterScreen; form1.ShowDialog();

    Примечание. Не вызывайте Form.CenterToScreen() напрямую из кода. Прочтите здесь.

person Nayana Adassuriya    schedule 11.09.2013

Одна строка:

this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
                          (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
person Sith2021    schedule 10.10.2012
comment
Это показывает хороший способ получить центр любого 'x' или 'y' вручную. Мне нужен был «центральный экран», но только для координаты «y». - person atconway; 20.11.2012
comment
Почему Screen.PrimaryScreen? Что делать, если форма находится на «SecondaryScreen»? Вы должны использовать Screen screen = Screen.FromControl(this); здесь. - person Artemix; 07.02.2013
comment
Я использую этот примитивный метод просто потому, что он работает на .NET Compact Framework 3.5, и это также объясняет, почему я не использую Screen.FromControl(this), а оставляю PrimaryScreen. (Я разрабатываю приложение с аппаратными ограничениями) :-) - person Yeo; 27.10.2015
comment
Этот метод подходит, если вы используете только один экран. Однако, если у вас есть несколько мониторов и вы нажимаете ярлык здесь на левом мониторе, вы действительно не хотите, чтобы он открывался на правом. Свойство StartPosition сделает это за вас. - person Trevor_G; 16.02.2017
comment
Это не [для каждого монитора с учетом DPI]. - person vt.; 15.05.2017

В формах Windows:

this.StartPosition = FormStartPosition.CenterScreen;

В ВПФ:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Это все, что вам нужно сделать...

person Saimon    schedule 11.04.2013
comment
Лучший ответ на ситуацию. Я не хотел устанавливать позицию, но сбросить ее, как только я вернусь к форме. Это потрясающе. - person KangarooRIOT; 25.04.2017

Если вы хотите центрировать окна во время выполнения, используйте приведенный ниже код, скопируйте его в свое приложение:

protected void ReallyCenterToScreen()
{
  Screen screen = Screen.FromControl(this);

  Rectangle workingArea = screen.WorkingArea;
  this.Location = new Point() {
    X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - this.Width) / 2),
    Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - this.Height) / 2)};
}

И, наконец, вызовите метод выше, чтобы заставить его работать:

ReallyCenterToScreen();
person Sarsur.A    schedule 28.08.2013
comment
Это работает лучше всего, так как оно будет работать, даже если вы запустите this.Location = Screen.AllScreens[0].WorkingArea.Location; перед ним, другие ответы не работают в случае перемещения приложения при использовании нескольких экранов. - person TK-421; 31.07.2019
comment
Это работало на моей машине с 3 мониторами. - person ThePeter; 11.06.2021

Центрирование формы во время выполнения

1.Установите следующее свойство формы:
-> StartPosition : CenterScreen
-> WindowState: Normal

Это будет центрировать форму во время выполнения, но если размер формы больше ожидаемого, выполните второй шаг.

2. Добавьте пользовательский размер после InitializeComponent();

public Form1()
{
    InitializeComponent();
    this.Size = new Size(800, 600);
}
person Faiz Siddiqui    schedule 17.07.2014

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace centrewindow
{
    public partial class Form1 : Form
    {
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }

        [DllImport("user32.dll")]
        public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(HandleRef hwnd, out RECT lpRect);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CentreWindow(Handle, GetMonitorDimensions());
        }

        private void CentreWindow(IntPtr handle, Size monitorDimensions)
        {
            RECT rect;
            GetWindowRect(new HandleRef(this, handle), out rect);

            var x1Pos = monitorDimensions.Width/2 - (rect.Right - rect.Left)/2;
            var x2Pos = rect.Right - rect.Left;
            var y1Pos = monitorDimensions.Height/2 - (rect.Bottom - rect.Top)/2;
            var y2Pos = rect.Bottom - rect.Top;

            SetWindowPos(handle, 0, x1Pos, y1Pos, x2Pos, y2Pos, 0);
        }

        private Size GetMonitorDimensions()
        {
            return SystemInformation.PrimaryMonitorSize;
        }
    }
}

Центрирует любое окно, для которого вы можете получить дескриптор

person Rob    schedule 05.01.2011

Использовать это:

this.CenterToScreen();  // This will take care of the current form
person UJS    schedule 21.07.2017
comment
-100. Не вызывайте CenterToScreen() непосредственно из кода. Вместо этого задайте для свойства StartPosition значение CenterScreen. msdn.microsoft.com/en-us/ библиотека/ - person A876; 28.07.2017

Используйте свойство Location формы. Установите его в желаемую верхнюю левую точку

желаемый x = (desktop_width - form_witdh)/2

желаемый y = (desktop_height - from_height)/2

person Sarwar Erfan    schedule 05.01.2011

Может не совсем относиться к вопросу. Но может кому поможет.

Центральный экран не работает для меня. Причина заключалась в том, что я динамически добавлял элементы управления в форму. Технически, когда он центрировался, это было правильно, основываясь на форме до добавления элементов управления.

Итак, вот мое решение. (Должен работать с обоими сценариями)

int x = Screen.PrimaryScreen.Bounds.Width - this.PreferredSize.Width;
int y = Screen.PrimaryScreen.Bounds.Height - this.PreferredSize.Height;

this.Location = new Point(x / 2, y / 2);

Итак, вы заметите, что я использую «PreferredSize», а не просто использую «Высоту/Ширина». Предпочтительный размер будет содержать значение формы после добавления элементов управления. Где высота/ширина не будет.

Надеюсь, это поможет кому-то.

Ваше здоровье

person De Wet Ellis    schedule 12.11.2018

Вы можете использовать Screen.PrimaryScreen.Bounds для получения размера основного монитора (или проверить объект Screen для получения всех мониторов). Используйте те, у которых есть MyForms.Bounds, чтобы выяснить, где разместить форму.

person C.Evenhuis    schedule 05.01.2011

В случае нескольких мониторов и если вы предпочитаете центрироваться на правильном мониторе/экране, вы можете попробовать следующие строки:

// Save values for future(for example, to center a form on next launch)
int screen_x = Screen.FromControl(Form).WorkingArea.X;
int screen_y = Screen.FromControl(Form).WorkingArea.Y;

// Move it and center using correct screen/monitor
Form.Left = screen_x;
Form.Top = screen_y;
Form.Left += (Screen.FromControl(Form).WorkingArea.Width - Form.Width) / 2;
Form.Top += (Screen.FromControl(Form).WorkingArea.Height - Form.Height) / 2;
person Angel    schedule 06.02.2019

Рабочий образец

private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
    AccountAddForm f = new AccountAddForm();
    f.StartPosition = FormStartPosition.CenterScreen;
    f.Show();            
}
person Do Nhu Vy    schedule 12.06.2021