我在 WPF 应用程序中有一个 TextBlock
。
(Text
, Width
, Height
, TextWrapping
, FontSize
, FontWeight
, FontFamily
) 此 TextBlock
的属性是动态的(由用户在运行时输入)。
每次用户更改先前的属性之一时,TextBlock
的Content
属性都会在运行时更改。 (到这里一切正常)
现在,我需要根据先前指定的属性获取该 TextBlock
的行。
这意味着我需要 TextWrapping
算法产生的行。
换句话说,我需要一个单独的字符串中的每一行,或者我需要一个带有 Scape Sequence \n
的字符串。
有什么想法吗?
最佳答案
如果没有公开的方式来做到这一点,我会感到惊讶(尽管人们永远不知道,尤其是使用 WPF)。
确实看起来像TextPointer class是我们的 friend ,所以这是一个基于 TextBlock.ContentStart 的解决方案, TextPointer.GetLineStartPosition和 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
偏移一个,因为根据设计此属性返回的 TextPointer 始终将其 LogicalDirection 设置为向后。
,因此我们需要获取指向相同(!?)位置的指针,但 LogicalDirection 设置为 Forward
,无论如何这意味着。
关于c# - 根据TextWrapping 属性获取TextBlock 的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378441/