Domanda

Ogni volta che creo un nuovo modulo nella mia applicazione, utilizza il "Microsoft Sans Serif, 8.25pt" carattere di default. Non lo sto cambiando perché so che in questo caso il mio modulo dovrebbe raccogliere qualunque sia il carattere predefinito per il sistema. Tuttavia, quando eseguo la mia applicazione, il carattere utilizzato è tutt'altro che UI Segoe (il mio carattere di sistema predefinito nel mio sistema operativo Windows Vista).

Perché succede? Come posso assicurarmi che la mia applicazione assomigli a una normale applicazione Windows?

È stato utile?

Soluzione

Dai un'occhiata a questo post sul blog parlando del font predefinito in Forms che porta al problema riscontrato e questo Bug di connessione con la risposta di Microsoft. In breve, sembra che Forms non ottenga il carattere (corretto) predefinito di Windows (che è stato modificato).

Altri suggerimenti

La risposta accettata non risponde realmente alla domanda; spiega semplicemente perché si sta verificando questo comportamento.

Alcune delle altre risposte propongono solide soluzioni alternative, ma ho scoperto che la soluzione migliore è davvero quella di creare un modulo di base da cui ereditano tutti i moduli dell'applicazione e impostare la proprietà Font di questo modulo di base su SystemFonts .MessageBoxFont nel costruttore. Ciò non solo garantisce che l'applicazione raccolga il carattere corretto in fase di runtime, in base all'ambiente dell'utente (eliminando il potenziale problema posto da Hans Passant & # 8212; un XP senza Office 2007 farà ricorso a Microsoft Sans Serif in assenza di Segoe UI), ma ti offre anche il supporto in fase di progettazione per il tuo font Windows corrente. L'uso del carattere corretto in fase di progettazione risolve il problema che Josuegomes sottolinea, poiché qualsiasi controllo contenitore creato nel modulo prenderà il carattere utilizzato dal modulo in fase di progettazione.

Oltre ai vantaggi di cui sopra, questo ti libera dal dover ricordare di modificare il costruttore per ogni modulo che crei e garantisce la coerenza tra tutti i moduli nella tua applicazione, oltre a darti un posto dove mettere altre funzionalità comuni. Lo uso in un paio di modi diversi come p / invoking, ecc. Per correggere bug nell'implementazione di WinForms.

L'unico problema che rimane con questo approccio è se si desidera impostare uno stile di carattere per un controllo particolare, come grassetto. Il posto migliore per farlo è ancora nel costruttore di quel modulo, a partire dal carattere del modulo come base e modificando lo stile da esso:

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

È possibile aggiungere prima di InitializeComponent () nei costruttori di moduli:

this.Font = SystemFonts.MessageBoxFont;

Questo sembra funzionare con Windows XP e Windows Vista.

Sì, utilizza il carattere restituito da GetStockObject (DEFAULT_GUI_FONT) . Che è MS Sans Serif. Un font vecchio, ormai scomparso dalla maggior parte delle macchine. Il mappatore di caratteri lo traduce in, senza sorpresa, Microsoft Sans Serif.

Non esiste una procedura documentata che conosco per modificare quel carattere predefinito, i documenti SDK menzionano esplicitamente MS Sans Serif. Se vuoi Segoe, dovrai richiederlo. Il che non è così sicuro da fare, ci sono ancora molte macchine XP là fuori senza Office 2007. Il mappatore di caratteri lo tradurrà su una macchina che non ha Segoe disponibile. Non sono sicuro di ciò che viene fuori, non mi rimane più una macchina del genere.

L'impostazione della proprietà Font del modulo su SystemFonts.DialogFont non funziona se si hanno caselle di gruppo con controlli associati. I controlli all'interno della casella di gruppo non sono interessati dalla proprietà Font del modulo. Ho "risolto" questo impostando la proprietà Font su SystemFonts.DialogFont per ogni casella di gruppo.

I controlli all'interno della casella di gruppo non sono in effetti interessati dalla proprietà Font del modulo. Il motivo è che i controlli nei controlli contenitore vengono trattati come elementi secondari dei controlli contenitore come groupbox, ma non come elementi secondari del modulo principale. Affinché tutti i controlli, inclusi quelli nelle caselle di gruppo, possano essere ridimensionati correttamente, puoi utilizzare un codice simile al seguente:

        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;
                }
            }        
        }

Prova questo, fai clic su un modulo e modifica la dimensione del carattere, ad esempio ho cambiato la dimensione del carattere di modulo in 12pt e quindi prova trascinando la casella di testo nel modulo. Vedrai, anche la dimensione della casella di testo viene cambiata in 12pt. Ho appena ottenuto questa soluzione per caso.

Control.DefaultFont è ReadOnly; uno hacky era quello di sovrascriverlo è usare la riflessione.

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

Assicurati di avere un UT che tenga d'occhio questo codice, non esiste un contratto API per proteggerti se l'implementazione del Framework cambia.

Siate anche consapevoli del designer di moduli che la maggior parte delle volte inserirà il font alla lettera nelle classi .designer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top