2017-02-10 7 views
0

В C# WPF, у меня есть функция для извлечения текста из flowdocumentreader:(C# WPF) метод «TextPointer.GetTextInRun» игнорирует символы, такие как « г п»

static string GetText(TextPointer textStart, TextPointer textEnd) 
{ 
    StringBuilder output = new StringBuilder(); 
    TextPointer tp = textStart; 
    while (tp != null && tp.CompareTo(textEnd) < 0) 
    { 
     if (tp.GetPointerContext(LogicalDirection.Forward) == 
     TextPointerContext.Text) 
     { 
      output.Append(tp.GetTextInRun(LogicalDirection.Forward)); 
     } 
      tp = tp.GetNextContextPosition(LogicalDirection.Forward); 
    } 
    return output.ToString(); 
} 

Затем я использую функцию следующим образом:

string test = GetText(rtb.Document.ContentStart, rtb.Document.ContentEnd); 

Однако строка "test" игнорирует все разрывы строк, что означает "\r\n". Он сохраняет символ табуляции, "\t".

Мой вопрос в том, как сохранить все разрывы строк? Я хочу автоматически выделить первое предложение каждого абзаца, поэтому мне нужно обнаружить символы разрыва строки, "\r\n".

Заранее благодарим за ваше время.

Update: я загрузить документ .rtf в FlowDocumentReader так:

  if (dlg.FileName.LastIndexOf(".rtf") != -1) 
      { 
       paraBodyText.Inlines.Clear(); 
       string temp = File.ReadAllText(dlg.FileName, Encoding.UTF8); 
       MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(temp)); 
       TextRange textRange = new TextRange(flow.ContentStart, flow.ContentEnd); 

       textRange.Load(stream, DataFormats.Rtf); 
       myDocumentReader.Document = flow; 

       stream.Close(); 
      } 
+0

Любые конкретные причины, по которым вы не используете TextRang е? – Ron

+0

@Ramin Можете ли вы показать мне, как использовать TextRange для решения проблемы? Я новичок в C#. Благодарю. –

ответ

0

Отредактировано

при условии, что каждый пункт имеет по крайней мере одно предложение, которое заканчивается точкой, вы можете использовать следующий код, чтобы сделать первое предложение жирным:

 List<TextRange> ranges = new List<TextRange>(); 
     foreach (Paragraph p in rtb.Document.Blocks.OfType<Paragraph>()) 
     { 
      TextPointer pointer = null; 
      foreach (Run r in p.Inlines.OfType<Run>()) 
      { 
       int index = r.Text.IndexOf("."); 
       if (index != -1) 
       { 
        pointer = r.ContentStart.GetPositionAtOffset(index); 
       } 
      } 
      if (pointer == null) 
       continue; 

      var firsSentence = new TextRange(p.ContentStart, pointer); 
      ranges.Add(firsSentence); 

     } 
     foreach (var r in ranges) 
     { 
      r.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold); 
     } 
+0

Как я уже сказал в своем вопросе, я хочу получить первые предложения каждого абзаца. Возможно ли это с помощью TextRange? Благодарю. –

+0

@KaKaShi_CantAim Вы хотите изменить вес шрифта с начала абзаца до первой точки (.)? – Ron

+0

@KaKaShi_CantAim см. Редактирование. – Ron