Проблем с разделителната способност на екрана в WPF?

Ще открия резолюцията със следния код в WPF:

double height = System.Windows.SystemParameters.PrimaryScreenHeight;
double width = System.Windows.SystemParameters.PrimaryScreenWidth;

Текущата разделителна способност на екрана ми е 1920*1200, но height е 960.0, а width е 1536.0 !!!

Какво не е наред с него?
Благодаря предварително.


person Mohammad Dayyan    schedule 10.02.2010    source източник


Отговори (8)


Имайте предвид, че всички местоположения и размери на WPF са с плаваща запетая с единица 1/96 инча. Не пиксели. Това прави разделителната способност на вашия дизайн на прозореца независима. Правене на математика: височина = 960 / 96 = 10 инча. С вашия видео адаптер, настроен на 120 DPI (120/96 = 125%): 10 * 120 = 1200 пиксела. Същото за ширина: 1536 / 96 * 120 = 1920 пиксела.

System.Windows.Forms работи в единици пиксели. Получавате по-малко от 1050 за височината, защото тя изважда височината на лентата на задачите. Но за WPF винаги искате да работите с 1/96", никога пиксели.

person Hans Passant    schedule 10.02.2010

За още по-стабилно внедряване трябва да изчислите коефициентите DPI на вашата система и да работите с тези фактори. Нормалната стойност на DPI е 96, но някои монитори може да имат различни стойности. Помислете, че вашият код може да работи на монитор, който има DPI стойност, различна от 96. Помислете за този код:

    private static void CalculateDpiFactors()
    {
        Window MainWindow = Application.Current.MainWindow;
        PresentationSource MainWindowPresentationSource = PresentationSource.FromVisual(MainWindow);
        Matrix m = MainWindowPresentationSource.CompositionTarget.TransformToDevice;
        thisDpiWidthFactor = m.M11;
        thisDpiHeightFactor = m.M22;
    }

След това можете да използвате тези съотношения, за да получите крайните стойности:

CalculateDpiFactors();
double ScreenHeight = SystemParameters.PrimaryScreenHeight * thisDpiHeightFactor;
double ScreenWidth = SystemParameters.PrimaryScreenWidth * thisDpiWidthFactor;

След това стойностите на ScreenHeight и ScreenWidth трябва да съответстват на това, което виждате в прозореца Properties на вашия монитор.

person JeffFerguson    schedule 15.06.2010
comment
Хубаво е, но имате прозорец предварително. Как да изчисля DPI без прозорец? Трябва да е възможно - dpi е свойство на работния плот, а не само на прозореца. - person greenoldman; 21.10.2010
comment
Благодаря ви, това беше много полезно. - person Vladimir Amiorkov; 16.12.2015
comment
Изглежда има някакъв код, свързан с това тук: mesta-automation.com/ tecniques-scaling-wpf-приложение - person Beachwalker; 27.03.2017

Моля, извикайте това, след като вашият windows се зареди.

 public static class Ext
{
    public static Size GetNativePrimaryScreenSize(this Window window)
    {
        PresentationSource mainWindowPresentationSource = PresentationSource.FromVisual(window);
        Matrix m = mainWindowPresentationSource.CompositionTarget.TransformToDevice;
        var dpiWidthFactor = m.M11;
        var dpiHeightFactor = m.M22;
        double screenHeight = SystemParameters.PrimaryScreenHeight * dpiHeightFactor;
        double screenWidth = SystemParameters.PrimaryScreenWidth * dpiWidthFactor;

        return new Size(screenWidth, screenHeight);
    }
}
person Andreas    schedule 16.02.2016

Опитайте SystemParameters.FullPrimaryScreenWidth и FullPrimaryScreenHeight, аз смятам, че PrimaryScreenWidth и Height връща размера на наличния клиентски прозорец след премахване на лентата на задачите и други настолни ленти на вашия екран.

person Akash Kava    schedule 10.02.2010

можете да използвате това вместо това: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.primaryscreen.aspx

person Rob Fonseca-Ensor    schedule 10.02.2010
comment
Тествах го, резултатът е същият от първия ми пост! - person Mohammad Dayyan; 10.02.2010
comment
добре, това е странно. Какво се случва, ако промените разделителната способност на екрана от контролния панел? - person Rob Fonseca-Ensor; 10.02.2010
comment
Промених резолюцията на 1680*1050, резултатът: височина = 1002.0 ; ширина=1680.0. BTW: DPI е 125% - person Mohammad Dayyan; 10.02.2010

Ако поставите отметка на „Използване на DPI мащабиране в стил Windows XP“, тогава върнатата стойност на „Screen.PrimaryScreen.Bounds“ е правилна. Ако не, върнатата стойност се свива пропорционално със стойността на DPI (която е по подразбиране).

За да намерите квадратчето за отметка „Използване на DPI мащабиране в стил Windows XP“, разгънете връзката „За да направите текста и елементите на екрана по-ясни в програми, които не са предназначени за високо DPI“ в следната връзка: http://windows.microsoft.com/en-us/windows-vista/Make-the-text-on-your-screen-larger-or-smaller

person Marc G.    schedule 03.05.2012
comment
FYI: Тази връзка вече автоматично отива към обяснението на Windows 8.x, а не към XP/Vista/Win7 - person Clint StLaurent; 13.02.2014

Можете да използвате това:

float dpiX, dpiY;
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
     dpiX = graphics.DpiX;
     dpiY = graphics.DpiY;
}

double screenX = SystemParameters.PrimaryScreenWidth / 96 * dpiX;
double screenY = SystemParameters.PrimaryScreenHeight / 96 * dpiY;
person Marco Concas    schedule 24.07.2019

опитайте тези.. вярвам, че това може да коригира грешката.....

System.Windows.Form1.Screen.PrimaryScreen.Bounds.Height; System.Windows.Form1.Screen.PrimaryScreen.Bounds.Widtht;

person deepu    schedule 15.03.2010