Posizionamento del controllo dipendente dal carattere
-
09-06-2019 - |
Domanda
Mi piacerebbe utilizzare Segoe UI 9 pt su Vista e Tahoma 8 pt su Windows XP/ecc.(In realtà, mi accontenterei di Segoe UI su entrambi, ma i miei utenti probabilmente non l'hanno installato.) Ma, essendo abbastanza diversi, rovinano davvero il layout dei miei moduli.COSÌ...c'è un buon modo per affrontare questo problema?
Un esempio:Ho un Label
, con uno spazio vuoto al centro, nel quale inserisco a NumericUpDown
controllo.Se utilizzo l'interfaccia utente di Segoe, il file NumericUpDown
è circa 5 pixel circa a sinistra dello spazio vuoto, rispetto a quando uso Tahoma.Questo è un dolore;Non sono sicuro di cosa fare qui.
Quindi più specificatamente la mia domanda sarebbe:come posso posizionare i controlli nel mezzo di uno spazio vuoto nel mio file Label
s (o CheckBox
es, ecc.)?Più in generale:esiste un buon modo per gestire diversi tipi di carattere in Windows Forms?
Modificare:Non credo che la gente abbia capito la domanda.io so come variare i miei caratteri basato sul sistema operativo.È solo che non so come farlo affrontare i problemi di layout che derivano da ciò.
Rispondi ad ajryan, quick_dry:OK, ragazzi, avete capito la domanda.Immagino che MeasureString potrebbe funzionare, anche se sarei interessato a un'ulteriore esplorazione di modi migliori per risolvere questo problema.
Il problema con la suddivisione del controllo è più evidente, ad esempio, con a CheckBox
.Lì, se l'utente fa clic sulla "seconda metà" del CheckBox (che sarebbe un file Label
controllo, immagino), il CheckBox
non cambia stato.
Soluzione
È strano dover disporre un controllo all'interno di un altro.Potresti risolvere un problema a monte in modo errato.Sei in grado di dividere l'etichetta in due etichette con l'alto verso il basso in mezzo e magari fare affidamento su un pannello TableLayout di Windows Forms?
Se è essenziale provare a posizionarsi in base alle dimensioni dei caratteri, potresti utilizzare Graphics.MeasureString("Stringa prima dell'updown", myLabel.Font)
Se quello che cerchi è il posizionamento dei controlli dipendente dal carattere, probabilmente dovresti rinominare la domanda.
[modifica] Puoi gestire l'evento clic della parte "seconda metà" dell'etichetta e modificare lo stato della casella di controllo su quell'evento.L'intera faccenda sembra però un hack.Qual è il problema risolto da questo strano layout di controllo?Perché hai bisogno di un su-giù nel mezzo di un'etichetta?
Altri suggerimenti
Sono favorevole all'utilizzo di TableLayoutPanel per i controlli in linea a riga singola.
Di solito imposto ogni colonna e la prima riga su AutoSize e imposto la proprietà Dock di ciascun controllo figlio su Compila la finestra di progettazione.Ciò consente di visualizzare correttamente il layout orizzontale.Per allineare il testo tra etichette/caselle di testo, impostare la proprietà TextAlign su MiddleLeft.
Se il testo scorre alla riga successiva non c'è una soluzione facile.Usare Graphics.MeasureString/TextRenderer.MeasureText e qualche logica di avvolgimento elaborato è la soluzione migliore :(
Prima di tutto, puoi scoprire quale versione di Windows stai utilizzando con SistemaOperativo.Piattaforma proprietà nella libreria di sistema.
In secondo luogo, è possibile inserire le impostazioni del carattere nei file di risorse e determinare quale file di risorse utilizzare in base a determinate condizioni (ad esempio, la versione del sistema operativo).
Personalmente, però, penso che sarebbe carino lasciare che fosse l'utente a determinare i caratteri che Essi preferisci rispetto al carattere che desideri che utilizzino.
Infine, potresti voler dare un'occhiata a WPF poiché questo è uno degli spazi problematici che è stato progettato per risolvere.
il problema è risolvere il posizionamento dei controlli?cioè.sai che i caratteri X e Y funzionano sui sistemi operativi A e B e fornisci il layout che desideri con il testo che stai utilizzando su quei sistemi?
Il metodo MeasureString potrebbe aiutarti a elaborare il tuo layout in modo da non essere legato a caratteri specifici.
float textWidth = graphics.MeasureString(someString, someFont).Width;
(una modifica nell'allineamento del testo funzionerebbe?forse anch'io ho frainteso il problema)