Domanda

Sto cercando di creare colonne di testo per un'app C # che verrà eseguita su MSN Messenger. Sto avendo trouple che sta facendo tutto in fila.

Ecco un esempio dell'output che voglio:

1)  Pizza Hut                                            123 Fake St.
2)  Domino's Pizza                                       123 Fake St.
3)  The Cheesecake Cafe                                  123 Fake St.
4)  Capital Pizza & Steakhouse                           123 Fake St.
5)  Funky Pickle Pizza                                   123 Fake St.
6)  Boston Pizza                                         123 Fake St.
7)  Rose Bowl Rouge Lounge                               123 Fake St.
8)  Royal Pizza                                          123 Fake St.
9)  A Columbus Pizza & Donair Inc                        123 Fake St.

Ma poiché è un font a larghezza variabile, viene visualizzato in questo modo:

1)  Pizza Hut                                        123 Fake St.
2)  Domino's Pizza                                   123 Fake St.
3)  The Cheesecake Cafe                                  123 Fake St.
4)  Capital Pizza & Steakhouse                               123 Fake St.
5)  Funky Pickle Pizza                                   123 Fake St.
6)  Boston Pizza                                     123 Fake St.
7)  Rose Bowl Rouge Lounge                               123 Fake St.
8)  Royal Pizza                                          123 Fake St.
9)  A Columbus Pizza & Donair Inc                    123 Fake St.

Ho provato a usare la funzione string #PadRight () di C # e ho creato la mia funzione che aggiunge il riempimento usando spazi e tabulazioni. Entrambi funzionano bene con caratteri a larghezza fissa ma si rompono con caratteri a larghezza variabile.

Esiste un modo per determinare la larghezza di una stringa in un determinato carattere?

O qualcuno ha altri suggerimenti?

È stato utile?

Soluzione

Usa semplicemente la classe TextRenderer . Il caso più semplice:

Size size = TextRenderer.MeasureText("Hello world", someFont);

Se non si ha accesso a System.Windows.Fonts Graphics. MeasureString rimane, ha alcune limitazioni ma dovrebbe fare il lavoro:

Bitmap bmp = new Bitmap(1,1);
Graphics graphics = Graphics.FromImage(bmp);
SizeF size = graphics.MeasureString("Hello world", someFont);

Ma tieni presente che se il carattere del tuo testo e gli spazi DEVONO essere gli stessi, ci saranno casi in cui non puoi allineare perfettamente il testo. Non so cosa sia in grado di fare MSN Messenger nel tuo caso, ma tranne se hai accesso ad almeno un sottoinsieme di HTML non avrai un risultato perfetto.

Dovresti anche essere consapevole del fatto che se esegui misurazioni su un computer locale e invii a un altro senza il font corretto installato, le tue colonne non sembreranno più colonne, quindi sei limitato al sottoinsieme base di font presenti su tutti i computer.

Se anche il supporto di più sistemi operativi è un requisito, avrai alcuni grossi problemi poiché il carattere Arial su Mac e PC non sembra (e misura) esattamente lo stesso.

Altri suggerimenti

Potresti provare a utilizzare la classe Graphics per misurare la lunghezza della stringa assegnata a un carattere specifico, quindi usala per determinare quante schede utilizzare.

Sembra che tu stia provando a renderlo tutto in ASCII in un singolo campo di testo. Sì? Se è così, è piuttosto complicato. Sembra che tu abbia un numero fisso di schede dopo ognuna in questo momento, e questo sarebbe il problema. Potresti invece fare spazi - cosa che sospetto stia facendo con padright (non hai molta familiarità con quella specifica funzione).

La cosa chiave, tuttavia, è che con ASCII puro come quello, mostrato in un carattere a larghezza variabile, non riuscirai mai ad allinearlo perfettamente in una seconda colonna. Puoi avvicinarti se sei diligente, ma è così - se hai una riga con molte lettere maiuscole W e un'altra con molte lettere minuscole, avrai grandi differenze di larghezza, qualunque cosa tu faccia. Se si esegue il rendering in GDI, l'approccio migliore è effettuare una chiamata a DrawText per colonna. Se lo desideri, puoi creare una stringa grande da ciascuna colonna e chiamare MeasureString sulla prima colonna per determinare la quantità di spazio che devi spostare per la seconda colonna.

O se questa è un'interfaccia in cui puoi fare html, le tabelle o i div funzionerebbero alla grande. Dipende dalle specifiche del tuo ambiente. Puoi anche fare qualcosa come avere due etichette con impostazione automatica dell'altezza in un pannello FlowLayout se si tratta di WinForms, ecc. Ci sono molte opzioni per farlo funzionare, ma non solo ascii puri con un carattere a larghezza variabile.

EDIT: Inoltre, ti ho visto chiedere come ottenere un'istanza della classe Graphics in un servizio web. Puoi fare qualcosa del genere:

    private static Bitmap bitmap = new Bitmap( 1, 1 );
    private static Graphics graphics = null;

    public static Graphics GetGeneralGraphics()
    {
        if ( graphics == null )
            graphics = Graphics.FromImage( bitmap );
        return graphics;
    }

Probabilmente vuoi creare quelle variabili locali (che hai correttamente smaltito una volta finito) in un contesto di servizi web.

Probabilmente dovresti formattare tutto in HTML, quindi potresti semplicemente generare elementi TABLE e TR / TD per le colonne

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