如何在不修剪的情况下使用DrawString?

时间:2013-06-04 14:07:45

标签: c# winforms

我发现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“指定不修剪。”

使用Java创建的示例的

This site甚至显示“无”以修剪比“字符”更多的字符。

还有其他技巧可以达到这个效果吗?

注意:我不想显示“......”或类似内容。我发现这是浪费空间,但这可能是对UX的讨论。

2 个答案:

答案 0 :(得分:12)

文本可能会被修剪,因为它实际上是无形地包裹到下一行。在对Graphics.DrawString的调用中,通过传递StringFormat属性设置为FormatFlagsNoWrap对象来禁用换行:

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

答案 1 :(得分: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; 你想在中画出字符串。

{{1}}

请注意,此代码假定您希望将文本锚定到矩形的左上角。否则,您应该在一个方法中生成假矩形,该方法保持与预期布局矩形相同的锚点。