2013-04-05 13 views
6

Czy istnieje rozwiązanie , które ma tylko jeden odpowiednik, który zlicza tylko pozycje wstawiania tekstu zamiast wszystkich symboli?Ekwiwalent GetPositionAtOffset tylko dla tekstu?

przykład Motywacja w C#:

TextRange GetRange(RichTextBox rtb, int startIndex, int length) { 
    TextPointer startPointer = rtb.Document.ContentStart.GetPositionAtOffset(startIndex); 
    TextPointer endPointer = startPointer.GetPositionAtOffset(length); 
    return new TextRange(startPointer, endPointer); 
} 

Edit: Do tej pory I "rozwiązany" to w ten sposób

public static TextPointer GetInsertionPositionAtOffset(this TextPointer position, int offset, LogicalDirection direction) 
{ 
    if (!position.IsAtInsertionPosition) position = position.GetNextInsertionPosition(direction); 
    while (offset > 0 && position != null) 
    { 
     position = position.GetNextInsertionPosition(direction); 
     offset--; 
     if (Environment.NewLine.Length == 2 && position != null && position.IsAtLineStartPosition) offset --; 
    } 
    return position; 
} 
+1

Wow ktoś NAPRAWDĘ nie chciał używać RichTextBox .. dzięki! – gjvdkamp

Odpowiedz

2

O ile mi wiadomo, nie ma. Moja sugestia jest taka, że ​​tworzymy w tym celu własną metodę GetPositionAtOffset. Można sprawdzić, które PointerContext TextPointer sąsiaduje za pomocą:

TextPointer.GetPointerContext(LogicalDirection); 

Aby dostać następną TextPointer który wskazuje na inny PointerContext:

TextPointer.GetNextContextPosition(LogicalDirection); 

Niektóre przykładowy kod użyłem w ostatnim projekcie tym, upewnia się, że kontekst wskaźnika jest typu Tekst, pętla aż do znalezienia. Można to wykorzystać w implementacji i pominąć przesunięcia przyrost jeżeli okaże się:

// for a TextPointer start 

while (start.GetPointerContext(LogicalDirection.Forward) 
          != TextPointerContext.Text) 
{ 
    start = start.GetNextContextPosition(LogicalDirection.Forward); 
    if (start == null) return; 
} 

Mam nadzieję, że można skorzystać z tej informacji.

+1

Nice. Nie znałem TextPointerContext do tej pory :) –

+0

Miło mi pomóc. Daj mi znać, jeśli potrzebujesz czegoś jeszcze! Dobre polowanie. – JessMcintosh

0

Nie można znaleźć skutecznego rozwiązania tego problemu przez długi czas. Następny fragment kodu działa w moim przypadku z najwyższą wydajnością. Mam nadzieję, że to pomoże również komuś.