104 votes

Comment obtenir la taille de l'écran actuel dans WPF?

Je sais que je peux obtenir la taille de l'écran principal en utilisant

System.Windows.SystemParameters.PrimaryScreenWidth;
System.Windows.SystemParameters.PrimaryScreenHeight;

Mais comment puis-je obtenir la taille de l'écran actuel? (Multi-Écran, les utilisateurs n'utilisent pas toujours l'écran principal, et non tous les écrans à l'aide de la même résolution, non?)

Il serait agréable d'être en mesure de l'acces a la taille de XAML, mais de le faire à partir du code (C#) suffirait.

80voto

Nils Points 1824

J'ai créé un petit wrapper autour de l'Écran à partir du Système.De Windows.Formes, actuellement tout fonctionne... Pas de doute sur le "dispositif de pixels indépendants", cependant.

public class WpfScreen
{
    public static IEnumerable<WpfScreen> AllScreens()
    {
        foreach (Screen screen in System.Windows.Forms.Screen.AllScreens)
        {
            yield return new WpfScreen(screen);
        }
    }

    public static WpfScreen GetScreenFrom(Window window)
    {
        WindowInteropHelper windowInteropHelper = new WindowInteropHelper(window);
        Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle);
        WpfScreen wpfScreen = new WpfScreen(screen);
        return wpfScreen;
    }

    public static WpfScreen GetScreenFrom(Point point)
    {
        int x = (int) Math.Round(point.X);
        int y = (int) Math.Round(point.Y);

        // are x,y device-independent-pixels ??
        System.Drawing.Point drawingPoint = new System.Drawing.Point(x, y);
        Screen screen = System.Windows.Forms.Screen.FromPoint(drawingPoint);
        WpfScreen wpfScreen = new WpfScreen(screen);

        return wpfScreen;
    }

    public static WpfScreen Primary
    {
        get { return new WpfScreen(System.Windows.Forms.Screen.PrimaryScreen); }
    }

    private readonly Screen screen;

    internal WpfScreen(System.Windows.Forms.Screen screen)
    {
        this.screen = screen;
    }

    public Rect DeviceBounds
    {
        get { return this.GetRect(this.screen.Bounds); }
    }

    public Rect WorkingArea
    {
        get { return this.GetRect(this.screen.WorkingArea); }
    }

    private Rect GetRect(Rectangle value)
    {
        // should x, y, width, height be device-independent-pixels ??
        return new Rect
                   {
                       X = value.X,
                       Y = value.Y,
                       Width = value.Width,
                       Height = value.Height
                   };
    }

    public bool IsPrimary
    {
        get { return this.screen.Primary; }
    }

    public string DeviceName
    {
        get { return this.screen.DeviceName; }
    }
}

27voto

Ici budy. Cela vous donnera seulement la largeur et la hauteur de la workarea

System.Windows.SystemParameters.WorkArea.Width
System.Windows.SystemParameters.WorkArea.Height

21voto

E.J. Points 28

Cela vous donnera l'écran actuel basé sur le coin supérieur gauche de la fenêtre, juste appeler cette.CurrentScreen() pour obtenir des informations sur l'écran en cours.

using System.Windows;
using System.Windows.Forms;

namespace Common.Helpers
{
    public static class WindowHelpers
     {
        public static Screen CurrentScreen(this Window window)
         {
             return Screen.FromPoint(new System.Drawing.Point((int)window.Left,(int)window.Top));
         }
     }
}

16voto

Anvaka Points 9296

Autant que je sache, il n'y a pas de WPF natif de la fonction pour obtenir les dimensions du moniteur de courant. Au lieu de cela, vous pourriez PInvoke natif de multiples moniteurs d'affichage des fonctions, les envelopper dans la gestion de la classe et d'exposer toutes les propriétés que vous avez besoin de consommer de XAML.

4voto

dana Points 47

Prenez le temps de parcourir le SystemParameters membres.

  • VirtualScreenWidth
  • VirtualScreenHeight

Ces même prendre en compte les positions relatives des écrans.

Testé uniquement avec deux moniteurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X