我正在通过DrawingContext
直接将文字绘制到控件中。文本是多行的,必须符合某个(计算的)宽度。如果一条线太长,那么就应该修剪它。
现在,WPF允许我使用TextTrimming.CharacterEllipsis
自动修剪文本,但是它在修剪文本时坚持要添加省略号。因为我想尽可能多地显示文本(没有TextWrap),我想问是否有一个函数可以在没有省略号的情况下进行修剪,例如只显示符合指定宽度的字符。
目前我正在使用dc.PushClip
/ dc.Pop
来剪切所需宽度的文字。然而,这会导致单词被切割成中间字符。
我想我可以分别得到文本的每一行,然后计算格式化文本的长度(直到我有最大拟合文本),但这看起来相当复杂(甚至可能很慢,因为我显示的很多很多文字)。
是否有内置函数将文本剪裁到一定宽度而没有省略号?也许使用P / Invoke?
编辑(回应Peter Dunhiho):我正在使用TextTrimming.None
。如果我不将剪辑推送到DrawingContext,那么文本将(根据MaxTextWidth)将被写入当前边界或转到下一行。
目前我正在做以下事情:
public void Render(double left, double top, double width, double height, DrawingContext dc)
{
FormattedText text = new FormattedText(text,
CultureInfo.CurrentUICulture,
FlowDirection.LeftToRight,
ArialTypeFace, 12,
BrushDictionary.SolidBlack);
text.Trimming = TextTrimming.None;
text.MaxTextWidth = width + 5;
text.MaxTextHeight = height;
dc.PushClip(new RectangleGeometry(new Rect(left,
top, width-0.5, height - 0.5)));
dc.DrawText(text, new Point(left, top));
dc.Pop();
}
这将正确地将文本(有多行)放在所需的矩形中。但是,如果文本中的一行太长,则文本将在字符中间被截断。我希望显示适合指定矩形的最后一个字符,并为每一行切掉其余字符。
编辑2:
示例文字:
This is just a random text
which spans multiple lines
使用TextTrimming.CharacterEllipsis:
This is jus...
which spans...
目前的方法:
This is just a
which spans mu
当前方法(带剪辑)可能会直接剪切到该行的最后一个字符,这是我想要阻止的!