2009-06-04 41 views
2

如果我給TextRenderer.MeasureText一些文本來衡量和寬度使用它將返回顯示該文本所需的高度。LinkLabel需要比TextRenderer.MeasureText更多的空間說

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

如果我給文本,寬度和高度的LinkLabel它會顯示寬度和高度的文本提供沒有任何截斷。

但是,如果我將鏈接放入LinkLabel.Links集合中,則LinkLabel將繪製文字,看起來多少有些字符之間的間距,並且有時會導致文本的末尾被裁剪。無論如何要防止這一點?我曾嘗試在有鏈接時添加填充,但沒有可靠的方法來確切知道需要多少空間。有沒有其他方法可以做到這一點?

回答

0

TextRenderer.MeasureText是DrawTextEx API的託管包裝。返回的值來自lprc結構體。您可能需要查看該API以獲取更多詳細信息。

+0

如果修復涉及得到正確的測量值,然後仍然使用LinkLabel控件,則似乎需要通過MeasureText或DrawTextEx來了解該文本將顯示爲鏈接,但沒有任何類似的內容。正如我在問題中所說的,如果文本只會顯示爲純文本,則MeasureText可以正常工作。 – 2009-06-05 17:51:51

+0

您是否在LinkLabel上啓用了AutoSize? – 2009-06-05 18:25:55

0

我想你可以刪除使其下劃線的樣式。 linkLabel.Styles.Add("text-decoration", "none");但當然它不會看起來像一個鏈接。 : -/

另一種解決辦法是自己添加填充我猜。

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; 

不是最漂亮的解決方案,但我會猜測它的工作原理。

1

如果一個LinkLabel包含多個鏈接,或者鏈接中包含部分文本或鏈接,則控件使用Graphics.DrawString/MeasureString而不是TextRenderer.DrawText/MeasureText。你可以很容易地看到它在行動,在渲染的最大區別是與小L字形:

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 
相關問題