18

我发现 DrawString 函数切断整个字符或单词的方式是违反直觉的。显示部分文本清楚地表明缺少某些内容。

这里有些例子:

字符串修剪。无:在此处输入图像描述

StringTrimming.字符:在此处输入图像描述

我想要什么:在此处输入图像描述 (GIMP 模型)

StringTrimming.None 是否与 StringTrimming.Character 相同?在我的情况下,它们的行为似乎完全一样。有什么我可以忽略的还是这是一个已知的“功能”?

根据文档StringTrimming.None “指定不修剪”。

该站点包含使用 Java 创建的示例,甚至显示“无”来修剪比“字符”更多的字符。

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

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

4

2 回答 2

14

文本可能看起来被修剪了,因为它实际上是在不可见的情况下换行到下一行。在对 的调用中,通过传递一个其属性设置为的对象来Graphics.DrawString禁用包装:StringFormatFormatFlagsNoWrap

StringFormat format =
    new StringFormat
    {
        FormatFlags = StringFormatFlags.NoWrap,
        Trimming = StringTrimming.None
    };
g.DrawString(s, font, brush, rect, format);
于 2013-06-04T14:41:01.427 回答
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;

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

于 2013-06-04T14:19:51.473 回答