Ich schreibe eine Windows-Formularanwendung in C# und ich erstelle eine RichTextBox (über Code, nicht den Designer). Ich setze die AutoWordSelection-Eigenschaft auf false, aber wenn ich etwas im Feld markiere, springt es immer noch an die Grenzen der Wörter plus ein Leerzeichen. Ist dies ein Fehler in .NET oder mache ich es falsch?
Antworten
Zu viele Anzeigen?Mit .NET 3.5 habe ich immer noch dieses Problem. Dieses Problem wurde 2005 an Microsoft gemeldet und als "Wont Fix" gekennzeichnet. Dies ist die letzte Nachricht, die ich zu diesem Problem finden kann.
Hier ist der MS Connect Fehlerbericht: http://connect.microsoft.com/VisualStudio/feedback/details/115441/richtextboxs-autowordselection-property-does-not-work-correctly#details
Hier ist ein neuerer Beitrag aus dem Jahr 2010 über eine andere Person, die das Problem bemerkt hat: http://sonicflare.net/2010/01/10/shipped-bug-feature/#more-192
----------UPDATE-------------
Ich habe es geschafft, indem ich ein zusätzliches AutoWordSelection = False in das Load-Ereignis des Formulars eingefügt habe.
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;
}));
}
Gleiches Problem hier mit RichTextBox in TabControl. Es spielte keine Rolle, ob sie im Designer oder dynamisch erstellt wurde. Die Lösung war, wie Roast in dem Kommentar unter seiner Antwort vorschlug, eines der Tab-Ereignisse zu verwenden. Nach dem Setzen von AutoWordSelection
a False
Dort trat das Problem gelegentlich auf, wenn die Registerkarten gewechselt wurden. Das Problem wurde behoben, indem man es auf True
und dann False
im Tab-Ereignis.
Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged
RichTextBox1.AutoWordSelection = True
RichTextBox1.AutoWordSelection = False
End Sub
Ich erstelle auch dynamisch Rich-Text-Boxen und hatte das gleiche Auswahlproblem. Es hat etwas gedauert, aber ich konnte es umgehen, indem ich im Wesentlichen meine eigene Auswahlroutine erstellt habe. Es gibt einige bemerkenswerte flackern, wenn meine Routine nicht einverstanden mit der Standardauswahl des Steuerelements, aber es ist nicht allzu schlimm.
Ich habe eine private Ganzzahl erstellt, die die Startposition der Auswahl festhält. Sie ist standardmäßig -1. Dann habe ich einen MouseDown-Event-Handler implementiert, um das Drücken der linken Maustaste zu verarbeiten. Er ermittelt die Zeichenposition am Mauszeiger und setzt die private Ganzzahl auf die aktuelle Zeichenposition, wenn sie sich nicht bereits innerhalb der aktuellen Auswahl befindet.
Der MouseMove-Eventhandler prüft dann, ob die linke Maustaste noch gedrückt ist und aktualisiert die Eigenschaften SelectionStart und SelectionLength des Steuerelements entsprechend der gespeicherten Startposition und der aktuellen Zeichenposition. Beachten Sie, dass die Startposition immer die linke Seite der Auswahl ist, so dass sie der Maus folgt, wenn Sie Text rückwärts auswählen.
Etwas komplizierter wird es, wenn Sie auch Drag-and-Drop und den Auswahlrand unterstützen wollen.
Ich bin auch auf dieses Problem gestoßen, allerdings mit einem Editor mit Registerkarten und mehreren RTBs. In diesem Fall können Sie den Workaround implementieren, indem Sie die Einstellung AutoWordSelection
Eigenschaft zu False
in dem Codeblock, der die RichTextBox erstellt. Zum Beispiel so:
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