Ich weiß, dass ich die Größe des primären Bildschirms mithilfe von ermitteln kann
System.Windows.SystemParameters.PrimaryScreenWidth;
System.Windows.SystemParameters.PrimaryScreenHeight;
Aber wie erhalte ich die Größe des aktuellen Bildschirms? (Benutzer mit mehreren Bildschirmen verwenden nicht immer den primären Bildschirm und nicht alle Bildschirme verwenden dieselbe Auflösung, oder?)
Es wäre schön, auf die Größe von XAML zugreifen zu können, aber dies über Code (C #) zu tun, würde ausreichen.
Antworten:
Soweit ich weiß, gibt es keine native WPF-Funktion, um die Abmessungen des aktuellen Monitors abzurufen. Stattdessen können Sie native Funktionen für mehrere Anzeigemonitore PInvoke verwenden , sie in eine verwaltete Klasse einschließen und alle Eigenschaften verfügbar machen, die Sie benötigen, um sie aus XAML zu verwenden.
quelle
Ich habe aus System.Windows.Forms einen kleinen Wrapper um den Bildschirm erstellt, derzeit funktioniert alles ... Ich bin mir jedoch nicht sicher über die "geräteunabhängigen Pixel".
quelle
SystemParameters.PrimaryScreenHeight
erhält die "geräteunabhängigen Pixel". Dies führt leider nicht zu "geräteunabhängigen Pixeln", sondern zu den physischen Pixeln. Naja.Hier Kumpel. Dadurch erhalten Sie nur die Breite und Höhe des Arbeitsbereichs
quelle
Dadurch erhalten Sie den aktuellen Bildschirm oben links im Fenster. Rufen Sie einfach this.CurrentScreen () auf, um Informationen zum aktuellen Bildschirm zu erhalten.
quelle
Nehmen Sie sich Zeit, um die SystemParameters-Mitglieder zu durchsuchen.
Diese berücksichtigen sogar die relativen Positionen der Bildschirme.
Nur mit zwei Monitoren getestet.
quelle
Warum nicht einfach das benutzen?
quelle
System.Windows.Forms.Screen
, um mit geräteunabhängigen Pixeln fertig zu werdenWenn Sie mit der Verwendung der System.Windows.Forms- Klasse vertraut sind , können Sie dies einfach tun eine Referenz hinzufügen Ihrem Projekt der System.Windows.Forms-Klasse :
Projektmappen-Explorer -> Verweise -> Verweise hinzufügen ... -> (Baugruppen: Framework) -> scrollen Sie nach unten und überprüfen Sie die Baugruppe System.Windows.Forms -> OK .
Jetzt können Sie mit System.Windows.Forms hinzufügen . Anweisung und Verwendung des Bildschirms in Ihrem wpf-Projekt wie zuvor.
quelle
Ich verstehe die Forderungen. Die Sache ist, es gibt WPF-Methoden, 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
B) Holen Sie sich die Werte für das ActualWindow, einschließlich einer Menge nützlicher WPF-Methoden
C) Sie können so viele Fenster hinzufügen, wie Sie möchten, um das gewünschte Verhalten zu erzielen, z. B. die Größe ändern, was auch immer minimiert werden. Jetzt können Sie jedoch immer auf den Bildschirm "Geladen" und "Gerendert" zugreifen
Bitte seien Sie vorsichtig mit dem folgenden Beispiel. Es gibt einen Code, der es erforderlich macht, diesen Ansatz zu verwenden. Er sollte jedoch funktionieren (er würde Ihnen die Punkte für jede der Ecken Ihres Bildschirms geben): Arbeitsbeispiel für Single, Dual Monitor und verschiedene Auflösungen (innerhalb der primären Hauptfensterklasse):
Routed Event:
quelle
Wenn Sie ein Vollbildfenster (mit einem
WindowState = WindowState.Maximized, WindowStyle = WindowStyle.None
) verwenden, können Sie den Inhalt folgendermaßenSystem.Windows.Controls.Canvas
einschließen:Dann können Sie
MyCanvas.ActualWidth
und verwendenMyCanvas.ActualHeight
die Auflösung des aktuellen Bildschirms zu erhalten, mit DPI - Einstellungen berücksichtigt und in geräteunabhängige Einheiten. Es werden keine Ränder hinzugefügt, wie dies das maximierte Fenster selbst tut.(Canvas akzeptiert
UIElement
s als Kinder, daher sollten Sie es mit allen Inhalten verwenden können.)quelle
Ich brauchte auch die aktuelle Bildschirmgröße, insbesondere den Arbeitsbereich, der das Rechteck ohne die Breite der Taskleiste zurückgab.
Ich habe es verwendet, um ein Fenster neu zu positionieren, das rechts und unten bis zur Position der Maus geöffnet wird. Da das Fenster ziemlich groß ist, hat es in vielen Fällen die Bildschirmgrenzen überschritten. Der folgende Code basiert auf der Antwort von @ej: Dadurch erhalten Sie den aktuellen Bildschirm ... . Der Unterschied besteht darin, dass ich auch meinen Repositionierungsalgorithmus zeige, von dem ich annehme, dass er tatsächlich der Punkt ist.
Der Code:
Einige Erklärungen:
<remark><code>...</code></remark>
quelle
Fenster in XAML auf dem Bildschirm
WindowStartupLocation="CenterOwner"
zentrieren und dann WindowLoaded () aufrufendouble ScreenHeight = 2 * (Top + 0.5 * Height);
quelle
quelle
Es funktioniert mit
Getestet auf 2 Monitoren.
quelle
VirtualScreen
alle Bildschirme umfasst -, also wird dies niemals funktionieren, wenn Sie mehr als einen Bildschirm haben!