2012-08-22 21 views
10

Jeśli podano tylko indeks i długość (lub EndIndex) określonego tekstu do wyboru, w jaki sposób można to zrobić w wersji RichTextBox WPF?Jak wybrać tekst RichTextBox, biorąc pod uwagę indeks i długość

Jest to bardzo wykonalne w Textbox, ponieważ można wywołać Textbox.Select (startIndex, długość), ale nie widzę czegoś podobnego w RTB.

Edit: Znalazłem odpowiedź do dokonywania wyboru

internal string Select(RichTextBox rtb, int index, int length) 
     { 
      TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd); 

      if (textRange.Text.Length >= (index + length)) 
      { 
       TextPointer start = textRange.Start.GetPositionAtOffset(index, LogicalDirection.Forward); 
       TextPointer end = textRange.Start.GetPositionAtOffset(index + length, LogicalDirection.Backward); 
       rtb.Selection.Select(start, end); 
      } 
      return rtb.Selection.Text; 
     } 

Jednak gdy próbuję podświetlić linię po wybór został dokonany:

rtb.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.LightBlue)); 

Funkcja podświetlania działa tylko przy pierwszej próbie i przerwy po drugiej próbie. Ktoś wie, dlaczego?

Odpowiedz

-1

Użyj metody Select() we właściwości RichTextBox.Selection.

+0

Select metoda pobiera dwa wskaźniki tekstowych i mam tylko indeks i długość do pracy z którymi są obie liczby całkowite. W jaki sposób poprawnie skonfigurować zmienne pola tekstowego w tym przypadku? – l46kok

-1

Blockquote można uzyskać tekst między spacjami .....

private String RichWordOver (RichTextBox RCH, int x, int y) {

 int pos = rch.GetCharIndexFromPosition(new Point(x, y)); 
     if (pos <= 0) return ""; 


     string txt = rch.Text; 

     int start_pos; 
     for (start_pos = pos; start_pos >= 0; start_pos--) 
     { 

      char ch = txt[start_pos]; 
      if (!char.IsLetterOrDigit(ch) && !(ch=='_')) break; 
     } 
     start_pos++; 
     int end_pos; 
     for (end_pos = pos; end_pos < txt.Length; end_pos++) 
     { 
      char ch = txt[end_pos]; 
      if (!char.IsLetterOrDigit(ch) && !(ch == '_')) break; 
     } 
     end_pos--; 


     if (start_pos > end_pos) return ""; 
     return txt.Substring(start_pos, end_pos - start_pos + 1); 
    } 

private void rchText_MouseClick (obiekt nadawcy, MouseEventArgs e) { MessageBox.Show (RichWordOver (rchText, eX, eY)); }

4

Ok to pytanie jest stare, ale w końcu znalazłem odpowiedź, więc umieszczam to tutaj.

Miałem podobne problemy, gdy próbowałem zrobić syntaxhighlighter za pomocą RichTextBox. To, co odkryłem, to że kiedy grasz w grę z ApplyPropertyValue, nie możesz już po prostu użyć GetPositionAtOffset. Uważam, że stosowanie wartości właściwości wydaje się zmieniać "wewnętrzne pozycje" TextTokens wewnątrz Dokumentu, stąd "hamowanie" tej funkcji.

obejścia:

Everytime trzeba pracować z GetPositionAtOffset pierwsze wezwanie ClearAllProperties na całkowitym TextRange Dokumentu, a następnie ponownie zastosować wszystkie swoje właściwości przy użyciu ApplyPropertyValue ale thistime od prawej do lewej . (prawe oznacza najwyższą wartość przesunięcia)

Nie wiem, czy zastosowałeś jakieś wartości właściwości, oczekując zaznaczenia zaznaczenia, więc być może trzeba będzie wprowadzić więcej myślenia.

ten sposób mój kod wyglądał kiedy to spowodowało ten problem:

private void _highlightTokens(FlowDocument document) 
    { 
     TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd); 
     foreach (Token token in _tokenizer.GetTokens(fullRange.Text)) 
     { 
      TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position); 
      TextPointer end = start.GetPositionAtOffset(token.Length); 

      TextRange range = new TextRange(start, end); 
      range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token)); 
     } 
    } 

I naprawiłem to tak:

private void _highlightTokens(FlowDocument document) 
    { 
     TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd); 
     fullRange.ClearAllProperties(); // NOTICE: first remove allProperties. 
     foreach (Token token in _tokenizer.GetTokens(fullRange.Text).Reverse()) // NOTICE: Reverse() to make the "right to left" work 
     { 
      TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position); 
      TextPointer end = start.GetPositionAtOffset(token.Length); 

      TextRange range = new TextRange(start, end); 
      range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token)); 
     } 
    } 
Powiązane problemy