2010-03-23 15 views
8

Quiero mover las posiciones de cursor a la derecha de donde estoy actualmente. Estoy registrado con PreviewKeyDown, y llamando InsertTextInRun() cuando se captura la tecla de tabulación, así:¿Cómo muevo el cursor una cierta cantidad de posiciones en un WPF RichTextBox?

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab) 
    { 
     rtb.CaretPosition.InsertTextInRun(" "); 
     e.Handled = true; 
    } 
} 

El problema es que el cursor queda en su lugar después de la llamada a InsertTextInRun(). Hace no mover al final del nuevo texto, que es el comportamiento que quiero. ¿Cómo haría esto?


Como acotación al margen - Sí, lo sé acerca de la propiedad AcceptsTab en RichTextBox. Estoy eligiendo ignorar que es y rodar mi propia funcionalidad pestaña debido a la tabulación con AcceptsTab tiene un efecto secundario desagradable de sangría a las líneas posteriores, que es no lo que quiero.

Respuesta

8

acabo encontré con el mismo problema. Parece que la posición final del cursor depende de la forma en que se movía justo antes del inserto.

siguiente código se asegura (3.5sp1) que después de inserción, el cursor será el de la derecha del texto insertado:

rtb.CaretPosition = rtb.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward); 
rtb.CaretPosition.InsertTextInRun(text); 

Tenga en cuenta que la propiedad LogicalDirection de intercalación puede (y tiene que) ser cambiado por esta ; no es suficiente simplemente crear TextPointer correcto.

1

utilizar el método de GetInsertionPosition() en el CaretPosition TextPointer. Esto le permitirá insertar el texto antes del cursor.

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab) 
    { 
     rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Backward).InsertTextInRun(" "); 
     e.Handled = true; 
    } 
} 
+0

Wow, que debe de haber perdido! Voy a intentarlo en breve, ¡gracias! :) –

+1

Lo siento, no hay dados. El símbolo de intercalación no se movió hasta el final del texto insertado. –

+0

Tampoco funcionó para mí, solo la solución que funciona es la solución aceptada. – ToastyMallows

1

Para probar, podría intentar forzar el movimiento mismo:

rtb.CaretPosition = rtb.Document.ContentEnd; 

Si funciona, es probable que tenga que aplicar la lógica adicional para situaciones en las que la ficha no se encuentra al final del contenido.

Cuestiones relacionadas