2016-07-12 2 views
0

Я работаю над адаптацией приложения к пользовательским значениям DPI (масштабирование Windows).Фактическое разрешение вторичного экрана для пользовательского DPI

Если я правильно понял, масштабирование заставляет приложения думать, что разрешение меньше, чем на самом деле. Например, имея шкалу 125%, если у вас есть разрешение 1920x1080, фактический размер максимального окна будет 1536x864. И точно, это может вызвать некоторые проблемы, если вы управляете некоторыми размерами и позициями из кода.

В настоящем время, я использую следующие значения для определения местоположения и т.д.:

  • SystemParameters.FullPrimaryScreenWidth и SystemParameters.FullPrimaryScreenHeight как "виртуального" (масштабируемого) разрешение;
  • Screen.PrimaryScreen.WorkingArea.Width и Screen.PrimaryScreen.WorkingArea.Height для оригинального разрешения;

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

Но все эти значения предназначены для основного экрана. Что делать, если мне понадобится сделать позиционирование и размер для дополнительного экрана, который может иметь разное фактическое (и, следовательно, другое «виртуальное») разрешение?

На данный момент я получаю экран как этот

var screen = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(Application.Current.MainWindow).Handle); 

, который позволяет мне получить фактическое разрешение, используя WorkingArea прямоугольник. Но как насчет «виртуального» разрешения? Есть ли аналог SystemParameters.FullPrimaryScreenWidth и т. Д. Любого экрана в стороне от первичного?

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

+0

Это никогда не происходит в приложении WPF, оно всегда отключает виртуализацию DPI по умолчанию. Конечно, ошибка, которую вы делаете, заключается в том, что вы забыли преобразовать значения, которые вы получаете из класса Screen, от пикселей до дюймов. [Посмотрите здесь] (http://stackoverflow.com/questions/30424985/how-to-convert-a-wpf-inch-unit-to-winforms-pixels-and-vice-versa). –

+0

@ HansPassant в любом случае, главный вопрос - как получить «виртуальное» разрешение. – lentinant

ответ

0

Вы можете использовать следующее соотношение

 // calculates text size in that main window (i.e. 100%, 125%,...) 
     var ratio = Math.Max(Screen.PrimaryScreen.WorkingArea.Width/SystemParameters.PrimaryScreenWidth, 
         Screen.PrimaryScreen.WorkingArea.Height/SystemParameters.PrimaryScreenHeight); 

Например, если вы хотите, чтобы показать развёрнутое окно на весь экране, необходимо использовать следующие прямоугольники (код из App.xaml.cs) :

 foreach (var screen in Screen.AllScreens) 
     { 
      var mainViewModel = container.Resolve<IMainWindowModel>(); 

      var window = new MainWindow(mainViewModel); 
      if (screen.Primary) 
       Current.MainWindow = window; 

      window.Left = screen.WorkingArea.Left/ratio; 
      window.Top = screen.WorkingArea.Top/ratio; 
      window.Width = screen.WorkingArea.Width/ratio; 
      window.Height = screen.WorkingArea.Height/ratio; 
      window.Show(); 
      window.WindowState = WindowState.Maximized; 
     } 

Кроме того, вы можете посмотреть на моем посте https://ireznykov.com/2017/01/13/wpf-windows-on-two-screens/, который ссылается на примере приложение GitHub, что выводит развернутое окно на все экраны.

Смежные вопросы