2013-06-04 96 views
16

我發現DrawString函數將整個字符或單詞剪切成違反直覺的方式。顯示部分文字清楚地表明缺少某些東西。如何在不修剪的情況下使用DrawString?

下面是一些例子:

StringTrimming.None:enter image description here

StringTrimming.Character:enter image description here

我想要什麼:enter image description here (GIMP樣機)

是StringTrimming.None的與StringTrimming.Character相同?他們的行爲似乎與我的情況完全相同。有什麼我可以忽略的,或者這是一個已知的「特徵」?

根據docs StringTrimming.None「指定不修剪」。

This site用Java創建的例子甚至顯示「無」來修剪比「字符」更多的字符。

是否有其他的技巧來獲得這種效果?

注意:我不想顯示「...」或類似內容。我覺得這是浪費空間,但這可能是UX的討論。

+0

抱歉..只是想知道..你會應用此? – matzone

+0

@Rotem好主意,但如果有很多垂直空間的話,這會搞亂包裝。不過,你應該添加這個答案。它適用於單行! – Sarien

+0

@matzone一個DataGridView(一個表格,適用於較少的Windows Forms知識)。 – Sarien

回答

9

由於文本實際上是隱藏在下一行,因此文本可能會被剪裁。在調用Graphics.DrawString,通過傳遞StringFormat對象,其FormatFlags屬性設置爲NoWrap禁用包裝:

StringFormat format = 
    new StringFormat 
    { 
     FormatFlags = StringFormatFlags.NoWrap, 
     Trimming = StringTrimming.None 
    }; 
g.DrawString(s, font, brush, rect, format); 
+1

+1我敢打賭,這是發生了什麼事。 –

+1

是否有可能保留包裝,並且只有在沒有足夠的空間用於其他生產線時才能將其禁用?(我可以衡量一切,但願意避免這種情況。) – Sarien

+1

@Sarien:這似乎沒有標誌。只有當繪圖矩形的高度小於行高的兩倍時,才需要使用'if'語句或'?'運算符,並傳遞'NoWrap'標誌。 –

4

作爲一種變通方法,您可以給DrawString方法更大的RectangleF不是你真正想要的,和你的Graphics對象的剪輯區域設置爲實際RectangleF要繪製的字符串。

RectangleF rect = new RectangleF(10, 10, 30, 15); 
e.Graphics.DrawRectangle(Pens.Red, Rectangle.Truncate(rect)); 

RectangleF fakeRect = new RectangleF(rect.Location, new SizeF(short.MaxValue, short.MaxValue)); 

Region r = e.Graphics.Clip; 
e.Graphics.SetClip(rect);    
e.Graphics.DrawString("1 Default", this.Font, SystemBrushes.ControlText, fakeRect); 
e.Graphics.Clip = r; 

請注意,此代碼假定您希望將文本錨定到矩形的左上角。否則,您應該在保持與您的預期佈局矩形相同的錨點的方法中生成假矩形。

+0

這可能是最好的方法。 'DrawString()'trim選項是關於在顯示之前操作字符串的。然而,你想要的是將其全部顯示並剪輯。 – DonBoitnott

相關問題