2010-05-18 25 views
5

Estoy escribiendo una aplicación de formularios para Windows en C# y creo un RichTextBox (a través de código, no del diseñador). Estoy estableciendo la propiedad AutoWordSelection en falso, pero cuando resalto cosas en el cuadro, salta a los límites de las palabras, más un espacio. ¿Es esto un defecto en .NET o lo estoy haciendo mal?RichTextBox.AutoWordSelection roto?

+0

¿A qué se refieren exactamente por "saltos a los límites de las palabras"? AutoWordSelection = True le permite al usuario hacer doble clic en una palabra y seleccionarla. Si esto no funciona, publique un fragmento de código y una descripción más detallada de lo que sucede. – Roast

+1

Si coloca el cursor en el medio de una palabra y lo arrastra al medio de otra palabra, debe tener la mitad de ambas palabras seleccionadas. Este no es el caso.Cuando lo arrastra a otra palabra, selecciona la palabra completa más el espacio en el lado derecho de la palabra, no solo los caracteres que arrastra su mouse. Si quiere ver lo que quiero decir, solo haga un richtextbox, escríbalo y trate de resaltar un grupo de palabras y verá que 'saltará' al borde de la palabra más cercana, y no se quedará exactamente con tu mouse – Nilbert

Respuesta

14

El uso de .NET 3.5 todavía tengo este problema. Esto se informó a Microsoft y se marcó como "Wont Fix" en 2005. Estas son las últimas noticias que puedo encontrar sobre el tema.

Aquí está el informe de error MS conexion: http://connect.microsoft.com/VisualStudio/feedback/details/115441/richtextboxs-autowordselection-property-does-not-work-correctly#details

Aquí está una más reciente 2010 post sobre otra persona que se dio cuenta del problema: http://sonicflare.net/2010/01/10/shipped-bug-feature/#more-192

---------- ACTUALIZACIÓN -------------

He hecho que funcione al colocar AutoWordSelection = False extra en el evento Load del formulario.

public Form1() 
    { 
     InitializeComponent(); 
     rich = new RichTextBox(); 
     rich.Size = new Size(150, 50); 
     rich.Text = "Ignoring a bug for five years does not make it a undocumented feature."; 
     rich.Location = new Point(20, 20); 
     rich.AutoWordSelection = false; 
     this.Controls.Add(rich); 
    } 

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.BeginInvoke(new EventHandler(delegate 
    { 
     rich.AutoWordSelection = false; 
    })); 
} 
+0

El problema es que los cuadros de texto se crean dinámicamente en el programa. Si se puede imaginar, cada vez que un usuario agrega una pestaña a un TabControl que tengo en mi formulario, la pestaña viene equipada con un RichTextBox. ¿Se puede arreglar en este caso? – Nilbert

+1

Quizás intente hacer esto en uno de los eventos de pestañas. Creo que la clave sería establecer la propiedad en un hilo diferente al creado. También tenga en cuenta que, aunque su selección de arrastrar y soltar funciona en mi solución, aún así, al hacer doble clic en una palabra, se selecciona. – Roast

0

También estoy creando dinámicamente cuadros de texto enriquecidos y tuve el mismo problema de selección. Me tomó un poco de esfuerzo, pero trabajé en torno a ello esencialmente haciendo mi propia rutina de selección. Hay un parpadeo notable cada vez que mi rutina no está de acuerdo con la selección predeterminada del control, pero no es tan malo.

Creé un entero privado que realiza un seguimiento de la posición de inicio de la selección. Es -1 por defecto. Luego implementé un manejador de eventos MouseDown para controlar presionar el botón izquierdo del mouse. Descubre la posición del personaje en el puntero del mouse y si aún no está dentro de la selección actual, establece el entero privado en la posición actual del personaje.

El controlador de eventos MouseMove comprueba que el botón izquierdo del mouse aún está presionado y actualiza las propiedades SelectionStart y SelectionLength del control, de acuerdo con la posición de inicio guardada y la posición actual del carácter. Tenga en cuenta que la posición de inicio siempre es el lado izquierdo de la selección, por lo que sigue al mouse cuando selecciona el texto hacia atrás.

Se vuelve un poco complicado si también se desea admitir el arrastrar y soltar y el margen de selección.

0

También me encontré con esto, pero con un editor de pestañas con múltiples RTB. En este caso, puede implementar la solución estableciendo la propiedad AutoWordSelection en False en el bloque de código que crea RichTextBox. Como tal:

Private Sub CreateNewRTBObject(ByVal items() As String) 
    Try 
     For Each s As String In items 
      If Not FilePaths.Contains(s) Then 
       rtb = New myRTB(s) 
       rtb.AutoWordSelection = False 
      End If 
     Next 
     tabs.SetTabWidth() 
    Catch ex As Exception 
     MsgBox(ex.ToString, MsgBoxStyle.Exclamation, title) 
    End Try 
End Sub 
1

Mismo problema aquí con RichTextBox en TabControl. No importa si se creó en Designer o dinámicamente. La solución era, como sugirió Roast en el comentario debajo de su respuesta, usar uno de los eventos de pestañas. Después de establecer allí AutoWordSelection en False, el problema volvería intermitentemente al cambiar de pestaña. Lo que solucionó eso fue establecerlo en True y luego False en el evento de tabulación.

Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged 
    RichTextBox1.AutoWordSelection = True 
    RichTextBox1.AutoWordSelection = False 
End Sub