Приложение С# WPF подходит в зависимости от размера монитора после максимизации/минимизации после перехода между мониторами

У меня есть два монитора:

Экран 1: дополнительный экран с разрешением 1920x1080

Экран 2: основной экран с разрешением 1600x900

Экран 1 больше экрана 2.

Когда я открываю приложение на экране 2, а затем перемещаю его с экрана 2 на экран 1 и пытаюсь свести к минимуму и затем максимизировать свое приложение, максимальный размер берется по экрану 2, а не по текущему размеру монитора (он не появляется максимально связанный с размером монитора)

Как я могу редактировать свой код, чтобы максимизировать и свести к минимуму разрешение экрана, где приложение существует, а не принимать его в зависимости от основного монитора?

Я использую код в этом потоке для изменения размера: https://blogs.msdn.microsoft.com/llobo/2006/08/01/maximizing-window-with-windowstylenone-considering-taskbar/

Что такое, как этот ответ: qaru.site/info/142518/...

Спасибо

Ответ 1

Чтобы получить размер текущего экрана, вам, вероятно, придется использовать метод windows forms FromHandle как

using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;

namespace TestApp
{
    public partial class MainWindow : Window
    {           
        public Screen GetCurrentScreen(Window window)
        {
            return Screen.FromHandle(new WindowInteropHelper(window).Handle);
        }

        public MainWindow()
        {
            InitializeComponent();

            var screen = GetCurrentScreen(this);
            var height = screen.Bounds.Height;
            var width = screen.Bounds.Width;

            // ...
        }     
    }
}

Другим вариантом было бы подписаться на событие LocationChanged окна, чтобы узнать, когда окно вашего приложения было перенесено на дополнительный экран, см. Этот ответ StepUp.

Ответ 2

сначала подпишитесь на событие с измененным состоянием:

public MainWindow()
{
   InitializeComponent();
   this.StateChanged += MainWindow_StateChanged;
}

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

private void MainWindow_StateChanged(object sender, EventArgs e)
{
   if (this.WindowState != WindowState.Minimized)
   {
                        this.Width = SystemParameters.PrimaryScreenWidth;
                        this.Height = SystemParameters.PrimaryScreenHeight;
                        //this.Width = SystemParameters.VirtualScreenWidth;
                        //this.Height =SystemParameters.VirtualScreenHeight;
                        //this.Width = SystemParameters.WorkArea.Width                            
                        //this.Height =SystemParameters.WorkArea.Height;
                     }
   }

которые должны обрабатывать ситуацию, SystemParameters предоставляют следующие данные:

PrimeryScreenHeight/Ширина:

Высота/Ширина экрана.

VirtualScreenWidth/высота:

Ширина/высота виртуального экрана.

WorkArea:

Структура RECT, которая получает координаты рабочей области, выраженные в виде координат виртуального экрана.