Eto: [WPF] RichTextArea Selection funktioniert nicht richtig

Erstellt am 4. Okt. 2018  ·  7Kommentare  ·  Quelle: picoe/Eto

Erwartetes Verhalten

Text gemäß definiertem Bereich richtig ausgewählt.

Tatsächliches Verhalten

Es gibt eine Fehlplatzierung von 5 Zeichen nach rechts.

Schritte zum Reproduzieren des Problems

  1. Erstellen Sie ein RichTextArea-Steuerelement
  2. Geben Sie Text ein
  3. Definieren Sie eine Auswahl, um ihre Farbe festzulegen

Code, der das Problem demonstriert

rtfcontrol.Appen(initialtext, true);
rtfcontrol.Append(sometext, true);
rtfcontrol.Selection = new Range<int>(rtfcontrol.Text.Length - sometext.Length, rtfcontrol.Text.Length -1);
rtfcontrol.SelectionForeground = Colors.Blue;
rtfcontrol.Append("\n", true);
rtfcontrol.Selection = new Range<int>(rtfcontrol.Text.Length);

Spezifikationen

  • Version: 2.5.0-ci-10013
  • Plattform(en): WPF
  • Betriebssystem(e): Windows 10

WPF:

wpf

GTK2 (Linux):

gtk2_linux

xamarin.Mac:

xamarin mac

Hilfreichster Kommentar

@DanWBR , ah ja, das wird leider nicht so funktionieren, wie Sie es haben - WPF fügt einen Zeilenumbruch am Ende der Eigenschaft Text (unabhängig davon, ob Ihr Text dies enthält oder nicht). Ich habe bisher keinen Weg gefunden, das zu umgehen, aber es ist ein anderes Problem als dieses.

Ich würde empfehlen, die aktuelle Position in einer Variablen beizubehalten und sie nach dem Anhängen von Text zu erhöhen. Wenn Sie jedes Mal auf die Eigenschaft Text zugreifen, nur um die Länge zu erhalten, wird dies langsamer, wenn der Text größer wird.

Alle 7 Kommentare

Unter Windows werden die Zeilenendezeichen irgendwie nicht zu den Indizes für die Auswahl gezählt. Als Workaround verwende ich derzeit folgenden Code:

private void Write(string message, Color c)
        {
            Append(message + Environment.NewLine, true);

            int idx = -1, last = -1;
            if (Environment.OSVersion.Platform == PlatformID.Unix)
            {
                idx = Text.LastIndexOf(message);
                last = Text.Length;
            }
            else
            {
                var lines = string.Join("", Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries));
                idx = lines.LastIndexOf(message);
                last = lines.Length;
            }

            if (idx == -1)
                return;

            Selection = new Range<int>(idx, idx + message.Length);
            SelectionForeground = c;
            Selection = new Range<int>(last, last);
        }

Aber das ist definitiv ein Bug...

Ja, ich habe den gleichen Hack wie @ManuelHu zuvor verwendet, er ist nicht schön. Ich bin mir noch nicht sicher, wie ich dies effektiv angehen kann, ohne mit großem Text hundelangsam zu sein.

Danke für die Meldung des Problems!

Hey @DanWBR ,

Dies sollte im neuesten Entwicklungszweig behoben werden. Könnten Sie es versuchen? Auf allen Plattformen werden Zeilenumbrüche jetzt als einzelnes \n Zeichen behandelt.

Hallo @cwensley , es muss noch ein Zeichen repariert werden:

captura de tela 2018-11-16 as 08 06 39

Hey @DanWBR , hast du eine Repro für das Off by One Issue? Ich kann es anscheinend nicht reproduzieren.

https://github.com/DanWBR/dwsim5/blob/windows/DWSIM.UI.Desktop.Forms/Forms/Flowsheet/Flowsheet.eto.cs#L1245

Vielleicht verwende ich falsche Indizes? Es funktioniert jedoch unter macOS und GTK.

@DanWBR , ah ja, das wird leider nicht so funktionieren, wie Sie es haben - WPF fügt einen Zeilenumbruch am Ende der Eigenschaft Text (unabhängig davon, ob Ihr Text dies enthält oder nicht). Ich habe bisher keinen Weg gefunden, das zu umgehen, aber es ist ein anderes Problem als dieses.

Ich würde empfehlen, die aktuelle Position in einer Variablen beizubehalten und sie nach dem Anhängen von Text zu erhöhen. Wenn Sie jedes Mal auf die Eigenschaft Text zugreifen, nur um die Länge zu erhalten, wird dies langsamer, wenn der Text größer wird.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen