2011-02-07 27 views
5

Estoy utilizando el control RichTextBox para mostrar los registros de la aplicación. Estoy actualizando el control una vez por segundo con algunas llamadas del método RichTextBox :: AppendText. Lo que es realmente molesto para mí es que el cursor sigue desplazándose a la última línea de texto. Es una situación muy incómoda cuando el usuario necesita analizar los registros que están al principio. He tratado siguiente solución a mi problema:Deshabilitar el desplazamiento automático RichTextBox

int pos = tb_logs.SelectionStart; 
tb_logs.AppendText("log message"); 
tb_logs.SelectionStart = pos; 

Esto no va al núcleo del problema, ya que el control está siendo redrawed periódicamente que es muy molesto. ¿Hay alguna solución más limpia?

+0

Suena un poco extraño porque ir hasta el final debe hacerse de forma explícita en alguna parte. ¿Estás seguro de que el código adjunto no establecerá la selección hasta el final? –

+0

No, solo AppendText ("texto"), AppendText ("\ t"), Appendtext ("\ n") – truthseeker

+0

Encontré algo interesante. Autoscroll solo ocurre cuando el área de texto tiene foco. Después de hacer clic en el área de texto, las cosas salen mal. Si no hago clic en él, puedo desplazar los mensajes con la barra de desplazamiento simultáneamente con los nuevos mensajes que se agregan y el texto no está saltando. – truthseeker

Respuesta

7

Si el problema es con el "desplazamiento vertical" desplazándose hacia abajo cuando está agregando el texto del registro, pero que sería quiere que sea en la parte superior todo el tiempo:

hay que añadir controladores de eventos a VScroll, TextChanged eventos y en el controlador de eventos establecer el desplazamiento hacia arriba

richTextBox1.VScroll += HandleRichTextBoxAdjustScroll; 
richTextBox1.TextChanged += HandleRichTextBoxAdjustScroll; 

private const UInt32 SB_TOP = 0x6; 
private const UInt32 WM_VSCROLL = 0x115; 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true)] 
private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, 
    IntPtr wParam, IntPtr lParam); 

private void HandleRichTextBoxAdjustScroll(Object sender, 
    EventArgs e) 
{ 
    PostMessage(handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero); 
} 

Se podría hacer lo mismo con la barra de desplazamiento horizontal también. Reemplazar WM_VSCROLL con WM_HSCROLL y SB_TOP con SB_LEFT

private const UInt32 WM_HSCROLL = 0x0114; 
private const UInt32 SB_LEFT = 0x06; 
0

Puede intentar tb_logs.SelectionLength = 1; junto con SelectionStart. Esto hará que se seleccione 1 char de tu posición actual.

No probé ... Pero puede trabajar

Cuestiones relacionadas