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

129

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

Шон
источник
Я полагаю, вы используете формы выигрыша?
Эндрю Орсич 05
8
Не используйте Form.CenterToScreen. Подробности смотрите в этом посте .
Artemix
используйте метод CenterToScreen () в конструкторе класса формы.
webMac

Ответы:

203

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

dzendras
источник
7
В системе с двумя мониторами форма будет центрирована на том, на котором в данный момент находится курсор. Таким образом, форма может внезапно перейти на другой монитор. См. Сообщение здесь .
Artemix
6
В документации, на которую вы ссылаетесь, действительно сказано: «Не вызывайте это напрямую из вашего кода». хотя не сказано почему.
Стивен Тернер
4
В документации говорится, что для центрирования формы следует использовать свойство StartPosition. У меня это сработало.
Джон Кротч
Это работает, мне просто нужно было создать его экземпляр: this.CenterToScreen ();
Лаки Политис
Я также хотел бы знать, почему в документации говорится: «Не вызывайте это прямо из кода».
Пит
154
  1. Использование окна свойств

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

    "

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

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

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

Наяна Адассурия
источник
34

Одна строка:

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

В Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen;

В WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

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

Saimon
источник
Лучший ответ для ситуации. Я не хотел устанавливать позицию, но хотел, чтобы она была сброшена, как только я вернусь в форму. Это потрясающе.
KangarooRIOT
16

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

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();
Sarsur.A
источник
Это работает лучше всего, поскольку он будет работать, даже если вы запустите this.Location = Screen.AllScreens[0].WorkingArea.Location;его до него, другие ответы не работают в таком случае перемещения приложения при использовании нескольких экранов.
TK-421
8

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

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

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

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

public Form1()
{
    InitializeComponent();
    this.Size = new Size(800, 600);
}
Файз Сиддики
источник
6
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;
        }
    }
}

Центрирует любое окно, на которое вы можете взять ручку

Роб
источник
3

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

this.CenterToScreen();  // This will take care of the current form
UJS
источник
1
-100. « Не вызывайте CenterToScreen () прямо из кода. Вместо этого установите для свойства StartPosition значение CenterScreen». msdn.microsoft.com/en-us/library/…
A876,
2

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

желаемый x = (ширина_ рабочего стола - form_witdh) / 2

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

Сарвар Эрфан
источник
1

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

C.Evenhuis
источник
1

Возможно, это не совсем относится к вопросу. Но может кому-то поможет.

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

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

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 вместо того, чтобы использовать высоту / ширину. Предпочтительный размер будет содержать значение формы после добавления элементов управления. Где Высота / Ширина не будет.

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

ура

Де Вет Эллис
источник
0

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

// 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;
F8ER
источник