Domanda

Se io do TextRenderer.MeasureText del testo per misurare e la larghezza di usarlo restituirà l'altezza necessaria per visualizzare il testo.

private static int CalculateHeight(string text, Font font, int width)
{
    Size size = TextRenderer.MeasureText(text, font, new Size(width, Int32.MaxValue), TextFormatFlags.NoClipping | TextFormatFlags.WordBreak);
    return size.Height;
}

Se io do quel testo, larghezza e l'altezza a un LinkLabel sarebbe visualizzare il testo nella larghezza e l'altezza dotato di nulla tagliato fuori.

Tuttavia, se ho messo un link nella collezione LinkLabel.Links, il LinkLabel disegnerà il testo con quello che sembra essere un po 'più spazio tra i personaggi e, a volte questo farà sì che alla fine del testo da ritagliato. Esiste un modo per evitare questo? Ho provato ad aggiungere padding quando c'è un collegamento, ma non c'è alcun modo affidabile per sapere esattamente come sarà necessario molto più spazio. Ci sono altri modi per fare questo?

È stato utile?

Soluzione

Si dovrebbe usare Control.GetPreferredSize metodo per calcolare la larghezza o l'altezza necessaria per il controllo (LinkLabel nel tuo caso). Non si deve usare MeasureText per tali scopi, spiegazione più dettagliata si possono trovare qui (Precisione dei risultati TextRenderer.MeasureText.)

Altri suggerimenti

Se un LinkLabel contiene più di un link, o ci sono parti di testo che vengono né in un collegamento, quindi il controllo utilizza Graphics.DrawString/MeasureString invece di TextRenderer.DrawText/MeasureText. Si può facilmente vedere in azione, la più grande differenza nel rendering è con la piccola L lettera:

linkLabel1.Text = new string('l', 100); // 100 x small L
linkLabel1.LinkArea = new LinkArea(0, 50);
linkLabel2.Text = new string('l', 100); // 100 x small L 

TextRenderer.MeasureText è un wrapper gestito per l' DrawTextEx API . Il valore restituito viene dalla struct LPRC. Si potrebbe desiderare di guardare quel API per maggiori dettagli.

Credo che si potrebbe rimuovere lo stile che lo rende sottolineare. linkLabel.Styles.Add("text-decoration", "none"); ma poi naturalmente non sarebbe simile a un link. : - /

Un'altra soluzione sarebbe quella di aggiungere l'imbottitura te immagino.

int heightBefore = linkLabel.Height;
int fontHeight = CalculateHeight(linkLabel.Text, linkLabel.Font, linkLabel.Width);
int paddingHeight = heightBefore - fontHeight;
linkLabel.Font = otherFont;
linkLabel.Height = CalculateHeight(linkLabel.Text, otherFont, linkLabel.Width);
linkLabel.Height += paddingHeight;

Non la più bella delle soluzioni, ma direi che funziona.

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