wake-up-neo.com

Wie erhalte ich die Größe des aktuellen Bildschirms in WPF?

Ich weiß, dass ich mithilfe von die Größe des primären Bildschirms ermitteln kann

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

Aber wie bekomme ich die Größe des aktuellen Bildschirms? (Benutzer mit mehreren Bildschirmen verwenden nicht immer den primären Bildschirm und nicht alle Bildschirme haben dieselbe Auflösung, oder?)

Es wäre schön, von XAML aus auf die Größe zugreifen zu können, aber dies mit Code (C #) zu tun, würde ausreichen.

77
Nils

Soweit ich weiß, gibt es keine native WPF-Funktion, um die Abmessungen des aktuellen Monitors abzurufen. Stattdessen können Sie PInvoke native Funktionen für mehrere Anzeigemonitore verwenden, sie in eine verwaltete Klasse einschließen und alle Eigenschaften bereitstellen, die Sie für die Verwendung in XAML benötigen.

12
Anvaka

Ich habe aus System.Windows.Forms einen kleinen Wrapper um den Bildschirm erstellt, derzeit funktioniert alles ... Ich bin mir jedoch nicht sicher, ob es sich um "geräteunabhängige Pixel" handelt.

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

Hier Kumpel. Dadurch erhalten Sie nur die Breite und Höhe des Arbeitsbereichs

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

Dadurch erhalten Sie den aktuellen Bildschirm, der oben links im Fenster angezeigt wird. Rufen Sie einfach this.CurrentScreen () auf, um Informationen zum aktuellen Bildschirm abzurufen.

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));
         }
     }
}
6
E.J.

Nehmen Sie sich Zeit, um die SystemParameters-Mitglieder zu durchsuchen.

  • VirtualScreenWidth
  • VirtualScreenHeight

Diese berücksichtigen sogar die relativen Positionen der Bildschirme.

Nur mit zwei Monitoren getestet.

5
dana

Wenn Sie mit der Verwendung der Klasse System.Windows.Forms vertraut sind, können Sie Ihrem Projekt einfach Verweis hinzufügen der Klasse System.Windows.Forms hinzufügen:

Projektmappen-Explorer -> Referenzen -> Referenzen hinzufügen ... -> (Assemblys: Framework) -> scrollen down und check System.Windows.Forms Assembly -> OK .

Jetzt können Sie die Anweisung sing System.Windows.Forms; hinzufügen und den Bildschirm wie zuvor in Ihrem wpf-Projekt verwenden.

3

Ich verstehe die Forderungen. Die Sache ist, dass es WPF-Methoden gibt, um diese Werte zu erhalten - aber ja, einer der Mitwirkenden hat Recht, nicht direkt. Die Lösung besteht nicht darin, alle diese Problemumgehungen zu erhalten, sondern den ursprünglichen Ansatz entsprechend dem sauberen Design und der sauberen Entwicklung zu ändern.

A) Stellen Sie das anfängliche Hauptfenster auf Bildschirm ein

B) Holen Sie sich die Werte für ActualWindow, einschließlich einer Menge nützlicher WPF-Methoden

C) Sie können beliebig viele Fenster für das gewünschte Verhalten hinzufügen, z. B. die Größe ändern oder minimieren. Jetzt können Sie jedoch immer auf den geladenen und gerenderten Bildschirm zugreifen

Bitte seien Sie vorsichtig mit dem folgenden Beispiel, es gibt einige Codes, die es notwendig machen, diese Art von Ansatz zu verwenden, aber es sollte funktionieren (es würde Ihnen die Punkte für jede der Ecken Ihres Bildschirms geben): Arbeitsbeispiel für Single, Dualer Monitor und verschiedene Auflösungen (innerhalb der primären Hauptfensterklasse):

InitializeComponent();
[…]
ActualWindow.AddHandler(Window.LoadedEvent, new RoutedEventHandler(StartUpScreenLoaded));

Routed Event:

private void StartUpScreenLoaded(object sender, RoutedEventArgs e)
    {
        Window StartUpScreen = sender as Window;

        // Dispatcher Format B:
        Dispatcher.Invoke(new Action(() =>
        {
            // Get Actual Window on Loaded
            StartUpScreen.InvalidateVisual();
            System.Windows.Point CoordinatesTopRight = StartUpScreen.TranslatePoint(new System.Windows.Point((StartUpScreen.ActualWidth), (0d)), ActualWindow);
            System.Windows.Point CoordinatesBottomRight = StartUpScreen.TranslatePoint(new System.Windows.Point((StartUpScreen.ActualWidth), (StartUpScreen.ActualHeight)), ActualWindow);
            System.Windows.Point CoordinatesBottomLeft = StartUpScreen.TranslatePoint(new System.Windows.Point((0d), (StartUpScreen.ActualHeight)), ActualWindow);

            // Set the Canvas Top Right, Bottom Right, Bottom Left Coordinates
            System.Windows.Application.Current.Resources["StartUpScreenPointTopRight"] = CoordinatesTopRight;
            System.Windows.Application.Current.Resources["StartUpScreenPointBottomRight"] = CoordinatesBottomRight;
            System.Windows.Application.Current.Resources["StartUpScreenPointBottomLeft"] = CoordinatesBottomLeft;
        }), DispatcherPriority.Loaded);
    }
1
Dororo

Warum nicht einfach so?

var interopHelper = new WindowInteropHelper(System.Windows.Application.Current.MainWindow);
var activeScreen = Screen.FromHandle(interopHelper.Handle);
1
Matteo Zilio

Fenster in XAML auf dem Bildschirm zentrieren WindowStartupLocation="CenterOwner" Und WindowLoaded () aufrufen

double ScreenHeight = 2 * (Top + 0.5 * Height);

0
mikesl