Frage

Jedes Mal, wenn ich ein neues Formular in meiner Anwendung zu erstellen, verwendet es die „Microsoft Sans Serif, 8.25pt“ font standardmäßig. Ich ändere es nicht, weil ich weiß, dass meine Form in diesem Fall sollte abholen, was die Standard-Schriftart für das System ist. Allerdings, wenn ich meine Anwendung ausführen, die Schriftart, die verwendet wird, ist nach wie vor alles andere als Segoe UI (mein Standard-Systemschriftart in meinem Windows Vista OS).

Warum geschieht das? Wie kann ich sicherstellen, dass meine Anwendung wie eine normale Windows-Anwendung aussieht?

War es hilfreich?

Lösung

Dieses Blogeintrag über das Gespräch Standardschriftart in Formen, die zu dem Problem führen Sie erleben und dieses Bug in Verbindung mit Microsofts Antwort. Kurz gesagt scheint es nur, dass Formulare nicht (richtig) Standard-Windows-Schriftart bekommen (die Sie geändert haben).

Andere Tipps

Die akzeptierte Antwort antwortet nicht wirklich die Frage; es gerade erklärt, warum dieses Verhalten auftritt.

Einige der anderen Antworten vorschlagen solide Abhilfen, aber ich habe festgestellt, dass die beste Lösung ist wirklich eine Grundform zu schaffen, dass alle Formulare in der Anwendung erben von und setzt diese Schriftart Eigenschaft der Basisform im Konstruktor SystemFonts.MessageBoxFont . Dies gewährleistet nicht nur, dass Ihre Anwendung wählt die richtige Schriftart zu Laufzeit, bezogen auf die Umgebung des Benutzers (das potenzielle Problem weg von Hans Passant-einem XP ohne Office 2007 gestellt Überschrift wird in Abwesenheit von Segoe UI zu Microsoft Sans Serif greifen ), sondern gibt Ihnen auch Design-time Unterstützung für Ihre aktuelle Windows-Schriftart. Mit der richtigen Schrift zur Entwurfszeit löst das Problem Josuegomes weist darauf hin, weil jeder Container-Steuerelement, das auf dem Formular erstellt wird, wird die Schrift durch die Form zur Entwurfszeit verwendet holen.

Neben den oben genannten Vorteilen, dies befreit Sie von erinnern, den Konstruktor für jede Form zu ändern, die Sie erstellen und sorgen für Konsistenz über alle Formulare in der Anwendung, sowie Ihnen einen Platz gibt andere gemeinsame Funktionalität zu setzen. Ich benutze dies in ein paar verschiedenen Möglichkeiten, wie zum Beispiel p / rufenden usw. Fehler in der WinForms Implementierung zu beheben.

Das einzige Problem, das mit diesem Ansatz bleibt, ist, wenn Sie eine Schriftart für ein bestimmtes Steuerelement, wie fett gesetzt werden sollen. Der beste Ort, dies zu tun, ist nach wie vor, dass Konstrukteurs-Form, mit der Form der Schrift als Basis beginnen und den Stil von ihm ändern:

myControl.Font = New Font(Me.Font, FontStyle.Bold)

Sie können vor InitializeComponent () hinzufügen im Formular-Konstruktor (e):

this.Font = SystemFonts.MessageBoxFont;

Dies erscheint mit Windows XP und Windows Vista zu arbeiten.

Ja, es verwendet die Schriftart von GetStockObject(DEFAULT_GUI_FONT) zurückgegeben. Was ist MS Sans Serif. Eine alte Schrift, lange von den meisten Maschinen gegangen. Die Schriftart-Zuordnung übersetzt es, keine Überraschung, Microsoft Sans Serif.

Es gibt keine dokumentierten Verfahren die ich kenne, dass die Standardschriftart zu ändern, erwähnen die SDK-Dokumentation MS Sans Serif explizit. Wenn Sie Segoe wollen, müssen Sie dafür fragen. Was nicht so sicher ist, ohne Office viele XP-Maschinen gibt 2007 zu tun, gibt es immer noch die Schriftart-Zuordnung es auf einer Maschine übersetzt wird, die nicht Segoe zur Verfügung hat. Nicht sicher, was herausspringt, ich habe nicht eine solche Maschine verlassen mehr.

Um die Schrift Eigenschaft des Formulars auf SystemFonts.DialogFont funktioniert nicht, wenn Sie Gruppenfelder haben mit den dazugehörigen Steuerungen. Die Kontrollen in dem Gruppenfeld nicht durch die Form der Font-Eigenschaft beeinflusst. I „gelöst“ dies durch die Font-Eigenschaft auf SystemFonts.DialogFont für jede Einstellung und jedes Gruppenfeld.

Die Kontrollen innerhalb des Gruppenfeldes sind in der Tat nicht durch die Form der Font-Eigenschaft beeinflusst. Der Grund dafür ist, dass die Kontrollen in Container-Steuerelemente werden als Kinder der Behälter Kontrollen wie groupbox behandelt, aber nicht Kinder der Hauptform. Damit alle Kontrollen des in Gruppenfeldern einschließlich richtig zu skalieren, Sie Code ähnlich wie unten verwenden können:

        foreach (Control ctr in this.Controls)
        {
            ctr.Font = SystemFonts.IconTitleFont;

            // controls in groupboxes are not child of main form
            if (ctr.HasChildren)
            {
                foreach (Control childControl in ctr.Controls)
                {
                    childControl.Font = SystemFonts.IconTitleFont;
                }
            }        
        }

Versuchen Sie diese, ein Formular klicken und Schriftgröße ändern ich zum Beispiel eine Schriftgröße von Form geändert 12pt und testen Sie dann per Drag Textfeld in das Formular. Sie werden sehen, die Textbox Größe geändert wird, als auch auf 12pt. Ich habe gerade diese Lösung durch Zufall bekam.

Die Control.DefaultFont ist Readonly; ein Hacky war es zu überschreiben ist Reflexion zu verwenden.

Type settingsType = typeof(Control);
var defaultFontField = settingsType.GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic);
defaultFontField.SetValue(null, new Font("Segoe UI", 8.25F));

Achten Sie darauf, ein UT ein Auge haben auf diesem Code zu halten, gibt es keine API Vertrag, den Sie, wenn die Framework-Implementierung Änderungen zu schützen.

Auch bewusst sein, der Formulardesigner die meiste Zeit wörtlich in .designer Klassen die Schrift einfügen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top