Die Situation
Wir verkaufen eine Windows Forms-Anwendung für Kunden auf der ganzen Welt. Wir haben es in mehreren Ländern in Europa und Amerika installiert. Keine Probleme. Letzte Woche haben wir unsere Software in Südkorea installiert und ein seltsames Verhalten erkannt ...
Das Problem tritt nur auf den Office-PCs des Kunden auf, aber auf allen. Einige haben Windows 7 Professional K, andere Windows XP.
Der Kunde hat einen neuen PC mit einem installierten Windows 7 Ultimate gekauft. Auf diesem PC gibt es kein Problem.
Die Funktion
Alle Elemente in unserer Anwendung sind von einer "Eltern-Benutzer-Kontrolle" abgeleitet, die spezielle Funktionen bietet. Eine dieser Funktionen ist "Autosizing und Positionierung". Wenn das übergeordnete Element die Größe ändert, wird diese Funktion aller untergeordneten Elemente aufgerufen.
Wenn unsere Anwendung startet, speichern wir die "ClientSize":
%Vor%Wenn sich die Größe der Anwendung ändert, berechnen wir den Skalierungsfaktor und lösen damit ein Ereignis aus:
%Vor%Nun führt jedes abonnierte Kind eine automatische Größenanpassung und Positionierung durch:
%Vor%Das Problem
Wenn unsere Anwendung auf den PCs der Kunden in Südkorea startet, ist die Breite etwa 20% zu klein. Das heißt, auf der rechten Seite befindet sich ein Bereich, der nur einen grauen Hintergrund hat. Die Höhe ist etwa 10% zu hoch. Das heißt, die Artikel, die sich am unteren Rand unserer Anwendung befinden, befinden sich außerhalb des Bildschirms.
Die Korrektur
Zuerst dachten wir, dass das Problem von der Windows DPI-Einstellung herrührt. Als ich meinen Laptop auf 125% stellte, sah es ähnlich aus. Aber die Kunden PCs sind alle auf 100% eingestellt ...
Dann haben wir über die Bildschirmauflösung nachgedacht. Alle haben andere, einige genauso wie mein Laptop ...
Alle haben verschiedene Grafikadapter ...
Alle haben .NET 4.5.1 ...
Der einzige Weg, das das Problem gelöst hat, war ein seltsames:
%Vor%Ändern Sie in der Datei "Designer" die ClientSize manuell von (1016, 734) auf ungefähr (900, 800). Dadurch sah es auf den meisten Kunden-PCs gut aus. Aber nicht auf alle.
Die Frage
Was kann die wirkliche Lösung für dieses Problem sein? Woher kommt es?
Haben Sie die gleichen Probleme auf denselben Computern, wenn Sie AutoScaleMode.Dpi
oder AutoScaleMode.None
anstelle von AutoScaleMode.Font
für jedes Steuerelement verwenden?
Wenn dies Ihr Problem behebt, kann das Problem mit der Verwendung von AutoScaleMode.Font
Auf einer hohen Ebene laut MSDN , der Effekt von AutoScaleMode.Font
ist, dass das Steuerelement relativ zu den Dimensionen der Schriftart skaliert wird, die die Klassen verwenden, das ist normalerweise die Systemschrift . " (Betonung meiner.)
Ich habe in die System.Windows.Forms.ContainerControl
Quellcode ein bisschen. Die Methode PerformAutoScale
wird automatisch aufgerufen > während des Ereignisses OnLayout
eines Steuerelements. Wenn AutoScaleMode
auf Font
gesetzt ist, wird GetFontAutoScaleDimensions
indirekt von OnLayout
aufgerufen. Die Kommentare in GetFontAutoScaleDimensions erklären, wie AutoScaleMode.Font
ist implementiert:
Also nimmt die Methode eine "lange" Zeichenkette, sendet sie an GDI und fragt: "Was sind die Dimensionen dieser Zeichenkette?" Bemerkenswerterweise berücksichtigt diese Methode die Schriftart des Steuerelements, bei der es sich normalerweise um die Systemschriftart handelt.
Wussten Sie, dass das koreanische Alphabet (Hangul) nicht in Arial dargestellt wird? (Ich habe nicht, bis ich diese Antwort recherchiert habe!) Es macht vollkommen Sinn, dass Ihre Systemschrift (etwas wie Tahoe oder Arial) anders ist als die Ihrer Kunden in Südkorea. Es macht auch Sinn, dass zwei verschiedene Schriftarten dieselbe Zeichenkette mit unterschiedlicher Höhe und Breite anzeigen. Also, ich wette, dass die fraglichen Probleme auf Arbeitsstationen mit einer anderen Systemschriftart als Ihrer Systemschriftart auftreten.
Wenn Sie also ein paar Tests durchführen und feststellen, dass AutoScaleMode.Font
wirklich der Täter ist, dann haben Sie ein paar Möglichkeiten:
Verwenden Sie nicht AutoScaleMode.Font
.
Legen Sie explizit die Schriftart aller enthaltenen Steuerelemente fest
ausdrücklich. Dadurch wird sichergestellt, dass die Schriftart von ContainerControl
ist nicht die Systemschriftart des Computers.
Unabhängig davon, was Sie tun, stellen Sie sicher, dass alle Ihre Container dieselbe AutoScaleMode
Einstellung verwenden. Mischen und Anpassen wird zu Kopfschmerzen führen.
Viel Glück!