我有一个TextBlock
在WPF应用程序中。
The (Text
, Width
, Height
, TextWrapping
, FontSize
, FontWeight
, FontFamily
)这个的属性TextBlock
是动态的(由用户在运行时输入)。
每次用户更改先前的属性之一时,Content
的财产TextBlock
在运行时改变。 (到这里一切都好)
现在,我需要得到那句话TextBlock
根据先前指定的属性。
这意味着我需要那些线TextWrapping
算法将会产生结果。
换句话说,我需要一个单独的字符串中的每一行,或者我需要一个带有 Scape Sequence 的字符串\n
.
有什么想法吗?
如果没有公开的方法来做到这一点,我会感到惊讶(尽管人们永远不知道,尤其是对于 WPF)。
确实看起来像文本指针类是我们的朋友,所以这是一个基于文本块.ContentStart, TextPointer.GetLineStartPosition and TextPointer.GetOffsetToPosition:
public static class TextUtils
{
public static IEnumerable<string> GetLines(this TextBlock source)
{
var text = source.Text;
int offset = 0;
TextPointer lineStart = source.ContentStart.GetPositionAtOffset(1, LogicalDirection.Forward);
do
{
TextPointer lineEnd = lineStart != null ? lineStart.GetLineStartPosition(1) : null;
int length = lineEnd != null ? lineStart.GetOffsetToPosition(lineEnd) : text.Length - offset;
yield return text.Substring(offset, length);
offset += length;
lineStart = lineEnd;
}
while (lineStart != null);
}
}
这里不多解释
获取该行的起始位置,减去上一行的起始位置即可得到该行文本的长度,这就是我们的结果。
唯一棘手(或不明显)的部分是需要抵消ContentStart
自设计以来由一The TextPointer returned by this property always has its LogicalDirection set to Backward.
,所以我们需要获取相同(!?)位置的指针,但是使用LogicalDirection set to Forward
,无论这意味着什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)