Hak*_*tık 6 c# wpf textblock word-wrap
我有一个TextBlockWPF应用程序.
的(Text,Width,Height,TextWrapping,FontSize,FontWeight,FontFamily的这个)性质TextBlock是动态的(由用户在运行时输入).
每次用户更改以前的某个属性时,都会在运行时更改其Content属性TextBlock.(一切都好,直到这里)
现在,我需要TextBlock根据之前指定的属性获取该行.
这意味着我需要TextWrapping算法将产生的线条.
换句话说,我需要在一个单独的字符串中的每一行,或者我需要一个带Scape序列的字符串\n.
有什么想法吗?
如果没有公开的方式,我会感到惊讶(尽管人们从来不知道,特别是对于WPF).
确实看起来像TextPointer类是我们的朋友,所以这里有一个基于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);
}
}
Run Code Online (Sandbox Code Playgroud)
这里没有太多要解释
获取线的起始位置,减去前一行的起始位置以获得线文本的长度,这里我们是.
唯一棘手的(或非显而易见的)部分是ContentStart因为设计需要偏移一个The TextPointer returned by this property always has its LogicalDirection set to Backward.,所以我们需要得到相同(!?)位置的指针,但LogicalDirection set to Forward无论如何都是这样.
| 归档时间: |
|
| 查看次数: |
1353 次 |
| 最近记录: |