Мне нужен способ центрировать текущее окно. Так, например, если пользователь нажимает кнопку, я хочу, чтобы окно центрировалось на экране. Я знаю, что вы можете использовать свойство startposition, но я не могу понять, как его использовать, кроме как при первом запуске приложения. Итак, как мне центрировать форму на экране?
Как центрировать окно на экране в С#?
Ответы (13)
Используйте метод Form.CenterToScreen().
this.Location = Screen.AllScreens[0].WorkingArea.Location;
- person TK-421; 31.07.2019
Использование окна Свойства
Выберите форму → перейдите в окно свойств → выберите «начальное положение» → выберите любое место, которое вы хотите.
Программно
Form form1 = new Form(); form1.StartPosition = FormStartPosition.CenterScreen; form1.ShowDialog();
Примечание. Не вызывайте Form.CenterToScreen() напрямую из кода. Прочтите здесь.
Одна строка:
this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
(Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
Screen screen = Screen.FromControl(this);
здесь.
- person Artemix; 07.02.2013
Screen.FromControl(this)
, а оставляю PrimaryScreen
. (Я разрабатываю приложение с аппаратными ограничениями) :-)
- person Yeo; 27.10.2015
В формах Windows:
this.StartPosition = FormStartPosition.CenterScreen;
В ВПФ:
this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
Это все, что вам нужно сделать...
Если вы хотите центрировать окна во время выполнения, используйте приведенный ниже код, скопируйте его в свое приложение:
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();
this.Location = Screen.AllScreens[0].WorkingArea.Location;
перед ним, другие ответы не работают в случае перемещения приложения при использовании нескольких экранов.
- person TK-421; 31.07.2019
Центрирование формы во время выполнения
1.Установите следующее свойство формы:
-> StartPosition : CenterScreen
-> WindowState: Normal
Это будет центрировать форму во время выполнения, но если размер формы больше ожидаемого, выполните второй шаг.
2. Добавьте пользовательский размер после InitializeComponent();
public Form1()
{
InitializeComponent();
this.Size = new Size(800, 600);
}
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;
}
}
}
Центрирует любое окно, для которого вы можете получить дескриптор
Использовать это:
this.CenterToScreen(); // This will take care of the current form
Используйте свойство Location формы. Установите его в желаемую верхнюю левую точку
желаемый x = (desktop_width - form_witdh)/2
желаемый y = (desktop_height - from_height)/2
Может не совсем относиться к вопросу. Но может кому поможет.
Центральный экран не работает для меня. Причина заключалась в том, что я динамически добавлял элементы управления в форму. Технически, когда он центрировался, это было правильно, основываясь на форме до добавления элементов управления.
Итак, вот мое решение. (Должен работать с обоими сценариями)
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», а не просто использую «Высоту/Ширина». Предпочтительный размер будет содержать значение формы после добавления элементов управления. Где высота/ширина не будет.
Надеюсь, это поможет кому-то.
Ваше здоровье
Вы можете использовать Screen.PrimaryScreen.Bounds
для получения размера основного монитора (или проверить объект Screen
для получения всех мониторов). Используйте те, у которых есть MyForms.Bounds
, чтобы выяснить, где разместить форму.
В случае нескольких мониторов и если вы предпочитаете центрироваться на правильном мониторе/экране, вы можете попробовать следующие строки:
// 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;
Рабочий образец
private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
AccountAddForm f = new AccountAddForm();
f.StartPosition = FormStartPosition.CenterScreen;
f.Show();
}