2014-06-16 10 views
6

Ich habe Probleme mit der korrekten Anzeige einer WinForms-App bei hohen DPI-Einstellungen. Ich habe verschiedene Websites überprüft, und die WinForms haben alle den richtigen AutoScaleMode. Ich habe versucht, dies auf DPI und Schriftart einzustellen. Die Formulare werden jedoch immer in der Nähe des Bodens abgeschnitten, wenn Einstellungen mit hohem DPI (z. B. 125%) verwendet werden.Probleme bei der korrekten Skalierung von WinForms mit DPI

Ich habe etwas Code hinzugefügt, um zu überprüfen, und wenn ich AutoScaleMode auf DPI festlegen, wenn das Formular lädt, sehe ich, dass AutoScaleDimensions 120,120 ist, wenn das Formular geladen wird, und CurrentAutoScaleDimensions ist auch 120,120. In der Datei Form.designer.cs gibt es eine Zeile, um AutoScaleDimension auf 96,96 festzulegen.

Wenn ich AutoScaleMode auf Schriftart festlegen, dann kann ich im Designer sehen, dass AutoScaleDimension korrekt auf neue System.Drawing.SizeF (6F, 13F) eingestellt ist, aber wenn das Formular geladen wird, werden AutoScaleDimension und CurrentAutoScaleDimension auf 8F gesetzt. 16F.

Diese App mischt einige WPF mit WinForms, und die WPF-Bildschirme erscheinen zuerst. Basierend auf DPI Scaling in .Net 3.5 in Mixed WinForms and WPF Application habe ich versucht, den TextFormattingMode für die Anwendung und für die WPF-Bildschirme, die zuerst angezeigt werden, auf "Display" zu setzen, aber das macht keinen Unterschied.

Ich bin, offen gesagt, ratlos, was das verursacht. Ich nehme an, ich könnte Code hinzufügen, um Dinge programmgesteuert zu ändern, indem ich die DPI zur Laufzeit erkenne, aber das sollte ich nicht tun müssen. Die AutoScaleMode (und verwandten) Eigenschaften sollen dies ziemlich automatisch machen. Also, was sollte ich sonst noch prüfen, könnte dieses Problem verursachen?

+0

125% ist nicht "High DPI". WPF hat definitiv Auswirkungen, weil es das Flag "High DPI aware" zur Laufzeit setzt, auch wenn es nicht im Manifest gesetzt ist. WinForms ist möglicherweise nicht sicher, ob es die Skalierung durchführen soll oder ob das Betriebssystem dies automatisch tun soll. –

+0

Ben, tut mir leid, ich denke, "höhere DPI" könnte genauer sein. Ich muss das genauer betrachten, da das Problem auch nach dem Ändern der App bestehen blieb, sodass wir die WPF-Bildschirme nicht zuerst anzeigen. – WarnerYoung

+0

Die modernen% basierten Einstellungen machen das Ganze höher/tiefer. "Dots Per Inch" ist niedriger für größere Schriftarten. Old School DPI-Einstellungen eine niedrigere Anzahl wurde für höhere Schriftarten verwendet, neuere Versionen von Windows nehmen eine Standard-DPI und verwenden eine Schriftgröße Prozent, so dass ein höherer Wert für höhere Schriftarten verwendet wird. Es ist im Allgemeinen weniger verwirrend, tatsächliche Zahlen als höher/niedriger zu verwenden. –

Antwort

0

Ist es möglich, dass bei der Monitorgröße und der höheren DPI-Einstellung der Bildschirm einfach nicht mehr groß genug ist, um das gesamte Formular anzuzeigen? Ich sage das, weil ich eine Winforms-App mit 1024 x 768 Pixeln entwickle und mit den Benutzer-DPI-Einstellungen experimentiere. Wenn ich die DPI auf 150% setze, kann ich den unteren Teil des Formulars nicht mehr auf meinem Monitor sehen, aber die App skaliert korrekt.

+0

Guter Punkt, Jeff, aber nein, das ist nicht, was hier passiert. Die Formulare sind immer noch klein genug, um auf den Bildschirm zu passen, nur nicht richtig dimensioniert. – WarnerYoung

8

Ich hatte vor ein paar Tagen ein ähnliches Problem. Nach ein paar Stunden Recherche fand ich schließlich eine sehr einfache Lösung - <dpiAware> zum Anwendungsmanifest hinzufügen. Hier ist ein Beispiel von Microsoft's website.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > 
    <asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
     <dpiAware>True</dpiAware> 
    </asmv3:windowsSettings> 
    </asmv3:application> 
</assembly> 

Für meinen Fall, ich brauche den <dpiAware> zum Pro-Monitor so einzustellen, dass es normal funktioniert. Das heißt, ändern Sie die Linie in der Mitte zu <dpiAware>Per-monitor</dpiAware>. Stellt die Anwendung nicht DPI-aware -

  • False:

    Die Unterschiede zwischen den einzelnen Wert sind nachstehend aufgeführt (Diese sind von MSDN) aufgeführt.

  • True - Legt die Anwendung auf System DPI-aware fest.
  • Per-Monitor - Unter Windows 8.1, legt die Anwendung auf Monitor-DPI-bewusst. Unter Windows Vista bis Windows 8 legt die Anwendung fest, dass sie nicht DPI-fähig ist.
  • True/PM - Unter Windows 8.1, legt die Anwendung pro Monitor-DPI bewusst. Unter Windows Vista bis Windows 8 wird die Anwendung auf System-DPI-Kenntnisse eingestellt.
Verwandte Themen