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.
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.
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.
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.
vous pouvez utiliser ceci à la place: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.primaryscreen.aspx
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
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);
}
}
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;