2010-02-10 18 views
23

Voy a detectar la resolución con el siguiente código en WPF:
Problema de resolución de pantalla en WPF?

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

resolución actual de mi pantalla es de 1920 * 1200, pero height es 960,0 y 1536,0 width es !!!

¿Qué tiene de malo?
Gracias de antemano.

Respuesta

32

Tenga en cuenta que todas las ubicaciones y tamaños de WPF son de coma flotante con una unidad de 1/96 de pulgada. No pixeles Esto hace que la resolución de sus diseños de ventana sea independiente. Hacer las matemáticas: altura = 960/96 = 10 pulgadas. Con su adaptador de video configurado en 120 DPI (120/96 = 125%): 10 * 120 = 1200 píxeles. Lo mismo para el ancho: 1536/96 * 120 = 1920 píxeles.

System.Windows.Forms funciona en unidades de píxeles. Obtiene menos de 1050 para la altura porque resta la altura de la barra de tareas. Pero para WPF siempre se quiere trabajar con 1/96" , nunca píxeles.

1

Trate SystemParameters.FullPrimaryScreenWidth y FullPrimaryScreenHeight, creo PrimaryScreenWidth y Altura Devuelve el tamaño de la ventana del cliente disponible después de quitar la barra de tareas y otros deskbands en su pantalla.

-1

tratar these..i creen que esto podría corregir el error .....

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

24

Para una aplicación aún más robusto, debe calcular los factores de DPI en el sistema y trabajar con esos factores un valor normal DPI es 96, pero algunos monitores pueden tener valores diferentes. Considere que su código puede estar ejecutándose en un monitor que tiene un valor de DPI diferente a 96. Considere este código:

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

continuación, puede utilizar esas proporciones para obtener los valores finales:

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

Los valores de ScreenHeight y ScreenWidth entonces debe coincidir con lo que se ve en la ventana Propiedades del monitor.

+4

Es bueno, pero tiene una ventana de antelación.¿Cómo calcular DPI que no tiene ventana? Debería ser posible: los dpi son propiedad del escritorio, no solo de la ventana. – greenoldman

+0

Gracias, esto fue muy útil. –

+0

Parece que hay algún código relacionado con esto aquí: https://www.mesta-automation.com/tecniques-scaling-wpf-application/ – Beachwalker

0

Si marca "Uso de Windows XP estilo DPI de escala", entonces el valor devuelto de "Screen.PrimaryScreen.Bounds" es correcta. De lo contrario, el valor devuelto se reduce proporcionalmente por el valor DPI (que es el valor predeterminado).

Para encontrar el "estilo de uso de Windows XP DPI de escala" casilla de verificación, expanda el "para hacer artículos de texto en pantalla y más claras en los programas que no están diseñados para alta DPI" que aparece en el siguiente enlace: http://windows.microsoft.com/en-us/windows-vista/Make-the-text-on-your-screen-larger-or-smaller

+0

FYI: Ese enlace ahora va automáticamente a la explicación de Windows 8.x, no a XP/Vista/Win7 –

0

Por favor, llame a esto después de que se carguen sus ventanas.

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