【问题标题】:How do I use DrawString without trimming?如何在不修剪的情况下使用 DrawString?
【发布时间】:2013-06-04 14:07:44
【问题描述】:

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

这里有一些例子:

StringTrimming.None:

StringTrimming.Character:

我想要什么: (GIMP 模型)

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

根据docsStringTrimming.None“指定不修剪。”

This site 使用 Java 创建的示例甚至显示“无”来修剪比“字符”更多的字符。

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

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

【问题讨论】:

  • 抱歉 .. 只是想知道 .. 你会把它应用到什么地方?
  • @Rotem 好主意,但是在有足够垂直空间的情况下会弄乱包装。不过,您应该将其添加为答案。它适用于单行!
  • @matzone 一个 DataGridView(一个不太懂 Windows 窗体的表格)。
  • @Sarien 我做了 :) 你能举个关于垂直空间的例子吗?我不明白你所指的情况。
  • @Rotem 如果单元格很高但对于文本来说太窄,DrawString 通常会换行文本。当然,如果你谎报矩形的大小,它就不再正确了。 :)

标签: c# winforms


【解决方案1】:

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

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

【讨论】:

  • 是否可以保留换行并仅在没有足够空间容纳另一行时才禁用它? (我可以衡量一切来做到这一点,但想避免这种情况。)
  • @Sarien:似乎没有标志。您必须使用if 语句或? 运算符,并且仅当您的绘图矩形的高度小于线高的两倍时才传递NoWrap 标志。
【解决方案2】:

作为一种解决方法,您可以为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;

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

【讨论】:

  • 这可能是最好的方法。 DrawString() trim 选项是关于在显示之前操作字符串。但是,您想要的是全部显示并剪辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多