Problème de résolution d'écran dans WPF?

je vais détecter la résolution avec le code suivant dans WPF :

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

la résolution actuelle de mon écran est 1920*1200, mais height est-960.0 et width est 1536.0 !!!

Quel est le problème avec elle ?

Merci à l'avance.

24
demandé sur Mohammad Dayyan 2010-02-10 13:52:00

7 réponses

n'oubliez pas que tous les emplacements et toutes les tailles de la WPF sont à virgule flottante avec une unité de 1/96 pouce. Pas de pixels. Cela rend la résolution de vos fenêtres indépendante. Faire le calcul: hauteur = 960 / 96 = 10 pouces. Avec votre adaptateur vidéo réglé à 120 DPI (120/96 = 125%): 10 * 120 = 1200 pixels. Idem pour la largeur: 1536 / 96 * 120 = 1920 pixels.

Système.Windows.Les formes fonctionnent en pixels. Vous obtenez moins de 1050 pour la hauteur, car il soustrait la hauteur de la la barre des tâches. Mais pour WPF vous voulez toujours travailler avec 1/96", jamais pixels.

33
répondu Hans Passant 2010-02-10 13:02:04

pour une implémentation encore plus robuste, vous devriez calculer les facteurs DPI sur votre système et travailler avec ces facteurs. Une valeur normale de DPI est de 96, mais certains moniteurs peuvent avoir des valeurs différentes. Considérez que votre code peut fonctionner sur un moniteur qui a une valeur DPI différente de 96. Considérer ce code:

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

vous pouvez alors utiliser ces rapports pour obtenir les valeurs finales:

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

les valeurs de ScreenHeight et ScreenWidth devraient alors correspondre à ce que vous voyez dans la fenêtre des propriétés de votre moniteur.

24
répondu JeffFerguson 2010-06-15 03:25:39

SystemParameters.FullPrimaryScreenWidth et FullPrimaryScreenHeight, je crois que PrimaryScreenWidth et Height renvoie la taille de la fenêtre client disponible après avoir enlevé la barre des tâches et d'autres deskbands sur votre écran.

1
répondu Akash Kava 2010-02-10 12:30:09
0
répondu Rob Fonseca-Ensor 2010-02-10 11:02:02

si vous cochez "Utiliser Windows XP style DPI scaling", alors la valeur retournée De "écran.PrimaryScreen.Des limites" est correct. Si non, la valeur retournée est proportionnellement diminué de la valeur des DPI (par défaut).

pour trouver la case à cocher "utiliser la mise à l'échelle du DPI de style Windows XP", élargissez le lien "pour rendre le texte et les éléments à l'écran plus clairs dans les programmes qui ne sont pas conçus pour un DPI élevé" dans le lien suivant lien: http://windows.microsoft.com/en-us/windows-vista/Make-the-text-on-your-screen-larger-or-smaller

0
répondu Marc G. 2012-05-03 15:28:10

Veuillez appeler cette après votre windows est chargé.

 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);
    }
}
0
répondu Andreas 2016-02-16 13:48:18

essayez ces..je crois que ça pourrait corriger l'erreur.....

Système.Windows.Form1.Écran.PrimaryScreen.Lier.Hauteur; Système.Windows.Form1.Écran.PrimaryScreen.Lier.Widtht;

-1
répondu deepu 2010-03-15 10:53:27