2016-08-30 2 views
0

Skalieren WPF-Anwendungen normalerweise problemlos auf DPI-Bildschirmen mit hoher Auflösung (ohne weitere Anpassung eines Manifests usw.)? Es war mein Verständnis, dass sie es taten?WPF-Anwendung auf dem Bildschirm mit hoher DPI unter Windows unscharf 10

Zwei WPF-Anwendungen, die ich geschrieben habe, erscheinen auf meinem neuen Laptop (mit Windows 10) auf dem Laptop-Bildschirm verschwommen. Normalerweise ist der primäre Bildschirm des Laptops auf einen externen Monitor mit niedriger Auflösung eingestellt, und das eingebaute Laptop-Panel wird auf 125% skaliert. Die Unschärfe wird jedoch unabhängig davon angezeigt, ob der Monitor mit niedriger Auflösung angeschlossen ist oder nicht.

Ich dachte, es könnte etwas mit der Art und Weise zu tun haben, wie meine beiden Anwendungen starten (über eine Hauptmethode, anstatt die Standard-Code-Vorlage, die ein primäres Fenster startet), aber ich habe gerade Visual Studio 2015 gefeuert und generiert eine brandneue WPF-Anwendung mit der Projektvorlage (nur ein paar Optionsfelder auf einem leeren Formular) und es skaliert auch nicht zu hohen DPI auf meinem System.

Es kann auch erwähnenswert sein, dass ich die Registrierungseinstellung "bevorzugtes externes Manifest" in meiner Windows-Kopie konfiguriert habe, um pro Anwendung die Hoch-dpi-Skalierung mit einem Manifest zu deaktivieren. (d. h. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide "PreferExternalManifest"=dword:00000001).

Antwort

1

Jedes Programm, das von PresentationCore abhängt, ist automatisch DPI-fähig. Es dauert an attribute to explicitly disable that.

Sie haben sicherlich ein anderes Problem, eine WPF-App unterstützt nicht automatisch die dpi-Erkennung pro Monitor. Eine Funktion, die seit Windows 8.1 verfügbar ist. Wenn die primäre Anzeige auf einem externen Monitor dies sehr wahrscheinlich macht, haben Sie ihr wahrscheinlich eine andere DPI-Einstellung gegeben, und jetzt müssen Fenster auf dem Bildschirm Ihres Laptops dieselbe DPI-Einstellung verwenden, wenn sie sich nicht explizit anmelden. Takes a fair amount of gritty work. Oder denken Sie daran, den Bildschirm Ihres Laptops einfach zum primären Bildschirm zu machen. Es ist einfach, mit dem Display-Applet hin und her zu schalten.

+0

Hallo Hans - danke für deine Antwort. Es scheint, dass das Hinzufügen von Multi-Monitor-Unterstützung ist, was ich tun müsste. Es ist interessant, dass die Trennung der niedrigen dpi (externen) Monitor das Rendering nicht früher gelöscht, wenn ich es versuchte - aber dann denke ich, ich fehlte nur den Schritt des Neustartens der Maschine (oder Ausloggen zumindest) nach dem Trennen der Monitor. Die Einstellung des Laptopbildschirms als primäre Anzeige hat das unscharfe Rendering auch nicht korrigiert - bis ich neu gestartet habe (Windows warnt, dass einige Anwendungen nicht auf Skalierungsänderungen reagieren, bis sie sich ausloggen, wenn Sie die primäre Anzeige ändern). –

+1

4.6.2 macht WPF-Anwendungen pro Monitor standardmäßig gemäß Microsoft bekannt. Siehe meine Antwort – magicandre1981

1

Beginnend mit .net 4.6.2 WPF-Anwendungen sind per Monitor-DPI standardmäßig bewusst, nicht in früheren Versionen:

WPF-Anwendungen sind jetzt aktiviert für pro-Monitor DPI Bewusstsein. Diese Verbesserung ist kritisch für Szenarien, in denen mehrere Anzeigen von variierenden DPI-Ebenen an eine einzelne Maschine angeschlossen sind. Da die gesamte WPF-Anwendung zwischen Monitoren umgestellt wird, ist das erwartete Verhalten , dass WPF die DPI der App automatisch an die -Anzeige anpasst. Es tut jetzt. In previous versions, you would have to write additional native code, um die DPI-Erkennung pro Monitor in WPF-Anwendungen zu aktivieren.

Installieren Sie die .4.6.2-Entwicklerwerkzeuge und richten Sie Ihre Anwendung auf 4.6.2, um Unterstützung dafür zu erhalten.

1

Angenommen, Sie haben eine hoch genug Version (4.6.2 nach einer anderen Antwort), das folgende tut es. Ich führe es kurz nach Window.Current.Activate():

double GetDpi() 
    { 
     var qualifiers = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues; 
     double scale = 96; 
     if (qualifiers.ContainsKey("Scale")) 
     { 
      string strScale = qualifiers["Scale"]; 
      double.TryParse(strScale, out scale); 
     } 
     return scale; 
    } 
Verwandte Themen