Como parte de mi GUI en C# (.Net 5.0), estoy usando el control RichTextBox (parte de System.Windows.Forms) para mostrar texto y enlaces en los que se puede hacer clic. Mi problema es cuando hago clic en cualquier enlace incluido sin que el formulario tenga primero el foco, el acto de hacer clic en un enlace también enfoca el cuadro de texto que automáticamente coloca el signo de intercalación al comienzo del texto, esto tiene el efecto de hacer que el cuadro de texto salte (o se desplace) hasta la parte superior del documento, perdiendo la posición.
Para mi problema particular, las clases de RichTextBox se asignan a TabPages dentro de un TabControl, y estos tres componentes se crean en respuesta a la interacción del usuario (comprendí que la creación de estos en tiempo de ejecución podría limitar los tipos de manejo de eventos disponibles para mí).
He definido el control RichTextBox con varias líneas y barras de desplazamiento horizontales y verticales, y para habilitar los enlaces en los que se puede hacer clic estoy usando la opción DetectUrls . Aquí está la lista completa de propiedades que se utilizan.
var control = new RichTextBox(); control.DetectUrls = true; control.Dock = DockStyle.Fill; control.Multiline = true; control.ReadOnly = true; control.WordWrap = false; control.Text = myContent; // large content filling multiple screens control.ScrollBars = RichTextBoxScrollBars.Both; control.LinkClicked += new LinkClickedEventHandler(RichTextBoxLinkClicked);Incluí LinkClicked porque quiero proporcionar alguna interacción para el usuario, pero si este controlador está asignado o no, no parece influir en el problema.
Edit1 Se me ocurrió una solución que funciona hasta cierto punto; evita el desplazamiento colocando el signo de intercalación al principio del enlace (aunque no funciona bien si hay más de uno del mismo enlace)
private void RichTextBoxLinkClicked(object sender, LinkClickedEventArgs e) { int caret = ((RichTextBox) sender).Text.IndexOf(e.LinkText); SelectionStart = caret; } Edit2 Una segunda solución que encontré es establecer el foco del cuadro de texto en un evento MouseEnter . He llegado a pensar que la clave del problema es establecer el foco de los cuadros de texto antes de que tenga lugar cualquier interacción con el usuario, pero tengo problemas para encontrar una manera satisfactoria de lograrlo.