2012-08-22 26 views
10

Si solo le dan un índice y una longitud (o EndIndex) de un cierto texto para seleccionar, ¿cómo lo hace en la versión WPF de RichTextBox?Cómo seleccionar el texto de RichTextBox dado un índice y longitud

Esto es muy factible en Textbox como se puede llamar a Textbox.Select (startIndex, Length) pero no veo nada equivalente en RTB.

Edición: He encontrado la respuesta a hacer una selección

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; 
     } 

Sin embargo, cuando trato de resaltar la línea después de la selección se ha hecho:

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

La función de resaltado sólo funciona en el primer intento y se rompe después del segundo intento. Alguien sabe el motivo de esto?

Respuesta

-1

Utilice el método Select() en la propiedad RichTextBox.Selection.

+0

El método Select toma en dos punteros de texto y sólo tengo un índice y longitud para trabajar con los cuales ambos son enteros. ¿Cómo configuro correctamente mis variables de textopointer en este caso? – l46kok

-1

cita en bloque se puede obtener el texto entre espacios .....

cadena privada RichWordOver (RCH RichTextBox, 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); 
    } 

privada rchText_MouseClick vacío (remitente del objeto, MouseEventArgs e) { MessageBox.Show (RichWordOver (rchText, eX, eY)); }

4

Ok esta pregunta es antigua, pero finalmente encontré la respuesta, así que puse esto aquí.

Estaba teniendo problemas similares cuando traté de hacer algunas mejoras de sintaxis con el RichTextBox. Lo que descubrí es decir, que cuando se juega con cerca de ApplyPropertyValue no se puede simplemente usar GetPositionAtOffset más. Creo que la aplicación de valores de propiedad parece cambiar las "posiciones internas" de TextTokens dentro del documento, por lo tanto, 'frenar' esta funcionalidad.

La Solución:

Cada vez que necesite trabajar con GetPositionAtOffset primera llamada ClearAllProperties en la TextRange del Documento completa, a continuación, volver a aplicar todas sus propiedades utilizando ApplyPropertyValue pero thisTime de derecha a izquierda . (derecha significa el desplazamiento más alto)

No sé si ha aplicado algún valor de propiedad espere que el resaltado Selección, por lo que es posible que tenga que pensar más.

Esta es la forma en que mi código se veía cuando la causa del problema:

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)); 
     } 
    } 

Y i fija de esta manera:

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)); 
     } 
    } 
Cuestiones relacionadas