2014-02-19 9 views
0

TextRange를 사용하여 강조 표시 할 구의 시작 부분을 가리키는 TextPointer tp가 있습니다. 그러나이 코드 : 무스 AU가FlowDocument에서 문구 강조 표시

< 내가 사용 코 = 무스 AU 콜라 렌 = 18 TR 길이 = 15 tr.text :

구문 :

TextRange tr = new TextRange(tp, tp.GetPositionAtOffset(phrase.Length)); 
Debug.WriteLine("phrase:" + phrase + ", len=" + phrase.Length + " and tr length=" + tr.Text.Length + " and tr.text=" + tr.Text + "<"); 

잘못된 출력을 생성 내 문서에 프레이즈의 시작 위치를 검색하려면 다음

x = tr.Text.IndexOf(phrase); 

것은 어떻게 문자열 구문과의 TextRange을 주어진 문자열 TextRange를받을 수 있나요 문서?

다음 대답

는 단어를 찾는 MSDN 예제 코드를 보여줍니다

https://stackoverflow.com/a/984836/317033

를 내 경우에는 문구와 함께 작동하지 않습니다하지만. 문서 별 : http://msdn.microsoft.com/en-us/library/ms598662(v=vs.110).aspx GetPositionAtOffset 오프셋에는 보이는 문자가 아닌 'symbols'이 포함됩니다. 따라서 GetPositionAtOffset과 함께 string.IndexOf()를 사용할 수 없으므로 샘플 코드가 제대로 작동하지 않습니다.

그래서 오프셋에 포함해야하는 문자가 아닌 요소 (문서의 기호)를 올바르게 반영해야하는 것처럼 보입니다. 내 순진한 계산은 구문이 실행되는 횟수를 계산하지 않습니다.

+0

어구의 길이가 1을 초과하면 구문이 3 번 실행됩니다. * 어깨를 으 *하면 – Mark

답변

2

다음 방법은 GetPositionAtOffset과 동일하지만 텍스트 문자 만 계산합니다.

TextPointer GetTextPositionAtOffset(TextPointer position, int characterCount) 
{ 
    while (position != null) 
    { 
     if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) 
     { 
      int count = position.GetTextRunLength(LogicalDirection.Forward); 
      if (characterCount <= count) 
      { 
       return position.GetPositionAtOffset(characterCount); 
      } 

      characterCount -= count; 
     } 

     TextPointer nextContextPosition = position.GetNextContextPosition(LogicalDirection.Forward); 
     if (nextContextPosition == null) 
      return position; 

     position = nextContextPosition; 
    } 

    return position; 
} 
+0

고마워요! 그것은 훨씬 더 깨끗한 방법입니다. – Mark

+0

참고 GetTextRunLength는 GetTextRun 함수처럼 새 줄을 제외합니다. 이 라인이나 TextRange로 라인을 넘길 수는 없습니다. 줄 바꿈을 포함하는 TextRange는 예상보다 다른 길이가됩니다. – Mark