2013-01-16 141 views
3

我有FixedDocument页,我想要TextBlock上,但它可以是,Textblock不适合在页面上的高度。
所以我想从TextBlock生成TextWrapping,然后创建新的TextBlock,根据高度将它放在页面上。
TextBlock拥有LineCount私有财产,这意味着它有TextLines包装后,我可以以某种方式得到它。
与运行创造TextBlockWPF TextBlock获取线后文本编辑

public TextItem(PageType pageType, Run[] runs, Typeface typeFace, double fontSize) 
     : base(pageType) 
{ 
    this.TextBlock = new TextBlock(); 
    this.TextBlock.Inlines.AddRange(runs); 
    if (typeFace != null) 
      this.TextBlock.FontFamily = typeFace.FontFamily; 

    if (fontSize > 0) 
      this.TextBlock.FontSize = fontSize; 
    this.TextBlock.TextWrapping = TextWrapping.Wrap; //wrapping 
} 

文本创建TextBlock

public TextItem(PageType pageType, String text, Typeface typeFace, double fontSize) 
     : base(pageType) 
{ 
    if (typeFace == null || fontSize == 0) 
     throw new Exception("Wrong textitem parameters"); 

    this.TextBlock = new TextBlock(); 
    this.TextBlock.Text = text; 
    this.TextBlock.FontFamily = typeFace.FontFamily; 
    this.TextBlock.FontSize = fontSize; 
    this.TextBlock.TextWrapping = TextWrapping.Wrap; 
    this.TextBlock.TextAlignment = TextAlignment.Justify; 

    this.TypeFace = typeFace; 
} 

设置图像宽度为TextBlock,并得到DesiredSize

this.TextBlock.Width = document.CurrentPage.Content.ActualWidth; 
this.TextBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
+0

http://pastebin.com/b6cZD5pp我知道一个办法让从文本块线,但这只是当控制已经开始时工作。 –

+0

你看过wpf'FlowDocument'吗?指向[msdn](http://msdn.microsoft.com/en-us/magazine/cc163371.aspx)的链接。 –

+0

是的,但FlowDocument不适合我。我尝试使用单页固定页面上的布局元素手册,它具有A4尺寸。这就是为什么我需要拆分文本块,如果它不适合。 –

回答

0

我所面临的正是同样的问题,并为有一段时间,我失去了希望,我认为没有办法解决这个问题。
但是,我错了,有很多解决方案(至少三个)
而你是对的,其中一人使用LineCount属性通过使用反射。
第二个使用它是自己的算法来获取线。
而第三种方法比我更喜欢,它有非常优雅的方式来获得你想要的结果。

请参阅此问题,以查看这三个答案。
Get the lines of the TextBlock according to the TextWrapping property?


这里是最好的解决办法的一个副本(在我看来)

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); 
    } 
}