Подтвердить что ты не робот

Как вы центрируете свое главное окно в WPF?

У меня есть приложение WPF, и мне нужно знать, как центрировать окно wain программно (не в XAML).

Мне нужно иметь возможность сделать это как при запуске, так и в ответ на определенные пользовательские события. Он должен быть динамически рассчитан, так как сам размер окна является динамическим.

Какой самый простой способ сделать это? Под старым кодом Win32 я бы назвал функции метрики системы и все это проработал. Это все еще так, как это было сделано, или есть простая функция CenterWindowOnScreen(), которую я теперь могу вызвать.

4b9b3361

Ответ 1

private void CenterWindowOnScreen()
{
    double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
    double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
    double windowWidth = this.Width;
    double windowHeight = this.Height;
    this.Left = (screenWidth / 2) - (windowWidth / 2);
    this.Top = (screenHeight / 2) - (windowHeight / 2);
}

Вы можете использовать этот метод, чтобы установить положение окна в центр экрана.

Ответ 2

Что ж, для времени запуска вы можете установить место запуска:

window.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Позже вам нужно будет запросить его. Информация (по крайней мере, для основного экрана) доступна через SystemParameters.PrimaryScreenWidth/Height.

Ответ 3

Не так ли просто установить

WindowStartupLocation="CenterScreen"

В определении XAML для окна.

Ответ 4

Rect workArea = System.Windows.SystemParameters.WorkArea;
this.Left = (workArea.Width - this.Width) / 2 + workArea.Left;
this.Top = (workArea.Height - this.Height) / 2 + workArea.Top;

Это учитывает размер панели задач (с помощью System.Windows.SystemParameters.WorkArea) и позиции (путем добавления workArea.Left и workArea.Top)

Ответ 5

Мне пришлось объединить несколько из этих ответов, чтобы охватить все базы в моем случае:

  • метод Peter, чтобы найти текущий монитор, а не только первичный монитор (серьезно, у кого всего 1 монитор на работе больше)
  • @метод Wild_A использовать workarea, а не screen bounds, чтобы учесть пространство для панели задач.
  • Мне пришлось добавлять масштабирование DPI, в частности, для планшета с разрешением 1280x800 как 1024x640, но который полезен для покрытия крайних случаев, для чего я нашел ответ для здесь, Обратите внимание: переменная dpiScaling имеет значение null, если вызывается при первой загрузке до отображения пользовательского интерфейса (здесь)
//get the current monitor
Screen currentMonitor = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(Application.Current.MainWindow).Handle);

//find out if our app is being scaled by the monitor
PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow);
double dpiScaling = (source != null && source.CompositionTarget != null ? source.CompositionTarget.TransformFromDevice.M11 : 1);

//get the available area of the monitor
Rectangle workArea = currentMonitor.WorkingArea;
var workAreaWidth = (int)Math.Floor(workArea.Width*dpiScaling);
var workAreaHeight = (int)Math.Floor(workArea.Height*dpiScaling);

//move to the centre
Application.Current.MainWindow.Left = (((workAreaWidth - (myWindowWidth * dpiScaling)) / 2) + (workArea.Left * dpiScaling));
Application.Current.MainWindow.Top = (((workAreaHeight - (myWindowHeight * dpiScaling)) / 2) + (workArea.Top * dpiScaling));

где myWindowWidth и myWindowHeight являются переменными, которые я использовал, чтобы вручную установить размер окна раньше.

Ответ 6

Если вам нужно нарисовать окно в среде с несколькими экранами. Я создал статический класс, в котором можно повторно использовать следующий метод:

public static void PostitionWindowOnScreen(Window window, double horizontalShift = 0, double verticalShift = 0)
{
    Screen screen = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(window).Handle);
    window.Left = screen.Bounds.X + ((screen.Bounds.Width - window.ActualWidth) / 2) + horizontalShift;
    window.Top = screen.Bounds.Y + ((screen.Bounds.Height - window.ActualHeight) / 2) + verticalShift;        
}

В конструкторе окна теперь просто вызовите метод:

this.Loaded += (s, a) => Globals.PostitionWindowOnScreen(this, 0, 0)

Ответ 7

В элементе window просто добавьте эту пару атрибут-значение: WindowStartupLocation = "CenterScreen"

Ответ 8

В качестве основного решения вы можете использовать свойство StartupLocation окна, установить его в одно из значений перечисления, определенное в перечислении System.Windows.WindowStartupLocation, для центра экрана есть один:

_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen;

К сожалению, это не всегда так просто; вам необходимо учитывать несколько мониторов, панели задач и т.д. Параметр "CenterScreen" открывает окно в центре экрана с курсором мыши. См. этот вопрос SO для получения большой информации или обратитесь к api.

Ответ 9

То, что я использую в своем приложении, работает для нескольких дисплеев и для разных настроек DPI

    //center a window on chosen screen
    public static void CenterWindow(Window w, System.Windows.Forms.Screen screen = null)
    {
        if(screen == null)
            screen = System.Windows.Forms.Screen.PrimaryScreen;

        int screenW = screen.Bounds.Width;
        int screenH = screen.Bounds.Height;
        int screenTop = screen.Bounds.Top;
        int screenLeft = screen.Bounds.Left;

        w.Left = PixelsToPoints((int)(screenLeft + (screenW - PointsToPixels(w.Width, "X")) / 2), "X");
        w.Top = PixelsToPoints((int)(screenTop + (screenH - PointsToPixels(w.Height, "Y")) / 2), "Y");
    }

    public static double PixelsToPoints(int pixels, string direction)
    {
        if (direction == "X")
        {
            return pixels * SystemParameters.WorkArea.Width / System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
        }
        else
        {
            return pixels * SystemParameters.WorkArea.Height / System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
        }
    }

    public static double PointsToPixels(double wpfPoints, string direction)
    {
        if (direction == "X")
        {
            return wpfPoints * System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width / SystemParameters.WorkArea.Width;
        }
        else
        {
            return wpfPoints * System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height / SystemParameters.WorkArea.Height;
        }
    }

Ответ 10

На основании ответа @Wild_A я просто подписался на событие SizeChanged и добавил этот обработчик событий:

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
    try
    {
        Rect workArea = SystemParameters.WorkArea;
        this.Left = (workArea.Width - e.NewSize.Width) / 2 + workArea.Left;
        this.Top = (workArea.Height - e.NewSize.Height) / 2 + workArea.Top;
    }
    catch (Exception ex) { ... Handel exception; }
}

Ответ 11

Если вам это нужно сразу увеличить   this.WindowState = System.Windows.WindowState.Maximized;

Ответ 12

Перейти к окну свойств MainWindow.xaml

  • найти свойство WindowStartupLocation из общей категории
  • выберите опцию CenterScreen из выпадающего
  • Запустите приложение

Для полного экрана

Перейти к окну свойств MainWindow.xaml

  • найти свойство WindowState из категории Common
  • выберите развернутый вариант из выпадающего
  • Запустите приложение