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

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

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

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

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

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

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

     window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 

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

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

     WindowStartupLocation="CenterScreen" 

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

     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 )

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

    • Метод Питера, чтобы найти текущий монитор, а не только первичный монитор (серьезно, у кого всего 1 монитор на работе больше?)
    • @ Wild_A метод использовать workarea а не screen bounds чтобы учесть пространство для панели задач.
    • Я должен был добавить масштабирование DPI, особенно для планшета с разрешением 1280×800 как 1024×640, но который полезен для покрытия краевых случаев, для которых я нашел для вас ответ. Обратите внимание, что переменная 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 – это переменные, которые я использовал, чтобы вручную установить размер windows раньше.

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

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

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

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

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

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

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

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

    Если вы мгновенно
    this.WindowState = System.Windows.WindowState.Maximized;

    Основываясь на ответе @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; } } 
    Interesting Posts

    Зачем использовать String.Equals над ==?

    Обнаружение цели в программном обеспечении на C ++

    Сохранить настройки в приложении .NET Winforms

    Как работает удаленная программа, например Team Viewer?

    Как номера версий .NET Framework, CLR и Visual Studio связаны друг с другом?

    Экран загрузки Angularjs по запросу ajax

    Никаких архитектур для компиляции для (ONLY_ACTIVE_ARCH = YES, active arch = x86_64, VALID_ARCHS = armv7 armv7s)

    Прокрутка Не работает IOS 7

    Добавить общую легенду для комбинированных ggplots

    Как передать несколько параметров в Objective-C?

    Как изменить цвет выделения в Java Swing TextArea? Кроме того, измените начало текста, соответствующего местоположению выделения

    rand () генерирует такое же число – даже с srand (time (NULL)) в моем главном!

    Внутренний беспроводной адаптер не работает после перемещения ноутбука

    Как настроить символы в WinDbg?

    Защитник Windows: отключить режим реального времени; Следить за расписанием и по требованию

    Давайте будем гением компьютера.