2014-10-23 2 views
0

TextBox 텍스트 용 WPF 응용 프로그램에서 Place Editor에서 작게 만들려합니다. 이를 위해 RichTextBox를 사용하고 싶습니다. RichTextBox는 FlowDocument와 함께 작동하고 TextBlock은 InlineCollection과 함께 작동하므로이 기능이 작동하지 않습니다. Rich TextBox 문서를 InlineCollection으로 변환하는 쉬운 방법이 있습니까? (인라인에서 지원되는 RTB 콘텐츠 만 허용하는 경우)WPF FlowDocument to InlineCollection

+0

당신은 그래서 당신이 필요로하는 모든이'FlowDocument'이다,하여 RichTextBox를 사용하고 싶습니다. 왜 그것을 InlineCollection으로 변환하고 싶습니까? –

+0

편집을 위해 RichTextBox를 사용하고 싶습니다! 나중에 TextBlock에 텍스트를 표시하려고합니다. –

+0

'FlowDocument'는 상당히 복잡하며 BlockCollection과 InlineCollection 및 기타 항목 (일반적이지는 않지만 가질 수도 있음)이 혼합되어 있습니다. 그래서 이것이 올바른 접근이라고 생각하지 않습니다. 변환시 약간의 추가 코드가 필요할 수 있으며 문서를 실행하는 데 문서에 따라 많은 시간이 소요될 수 있습니다. 내 충고는 TextBlock 대신에'RichTextBox','FlowDocumentReader','DocumentViewer','FlowDocumentPageViewer','FlowDocumentScrollViewer' 컨트롤 중 하나를 사용하는 것입니다. 'RichTextBox'의 경우,'IsReadOnly'를'true'로 설정하여 표현 자/뷰어로 사용할 수 있습니다. –

답변

3

FlowDocument에서 모든 인라인을 추출하는 데 다음과 같은 방법을 사용할 수 있습니다. 단락과 단락을 분리하기 위해 여분의 공백 인라인을 추가해야 할 수도 있습니다.

public static class FlowDocumentEx 
{ 
    public static ICollection<Inline> GetInlines(this FlowDocument doc) 
    { 
     return GetInlines(doc.Blocks); 
    } 

    public static ICollection<Inline> GetInlines(TextElementCollection<Block> blocks) 
    { 
     var inlines = new List<Inline>(); 

     foreach (var block in blocks) 
     { 
      if (block is Paragraph) 
      { 
       inlines.AddRange(((Paragraph)block).Inlines); 
      } 
      else if (block is Section) 
      { 
       inlines.AddRange(GetInlines(((Section)block).Blocks)); 
      } 
     } 

     return inlines; 
    } 
} 

이처럼 사용합니다 :

textBlock.Inlines.Clear(); 
textBlock.Inlines.AddRange(richTextBox.Document.GetInlines()); 
+0

완벽하게 작동합니다. Sharp Develop에서 TextBlock Content 용 서식있는 텍스트 편집기를 구현하는 데 사용합니다! –