Eto: [WPF] La selección de RichTextArea no funciona correctamente

Creado en 4 oct. 2018  ·  7Comentarios  ·  Fuente: picoe/Eto

Comportamiento esperado

Texto correctamente seleccionado según rango definido.

Comportamiento real

Hay un extravío de 5 caracteres a la derecha.

Pasos para reproducir el problema

  1. Crear un control RichTextArea
  2. Ingrese algo de texto
  3. Definir una selección para establecer su color

Código que demuestra el problema

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);

Especificaciones

  • Versión: 2.5.0-ci-10013
  • Plataforma (s): WPF
  • Sistema (s) operativo (s): Windows 10

WPF:

wpf

GTK2 (Linux):

gtk2_linux

Xamarin.Mac:

xamarin mac

Comentario más útil

@DanWBR , ah, sí, Text (independientemente de si su texto lo tiene o no). No he encontrado una forma de evitar eso en este momento, pero es un tema separado de este.

Lo que recomendaría es mantener la posición actual en una variable e incrementarla después de agregar texto. El acceso a la propiedad Text cada vez solo para obtener la longitud se ralentizará a medida que el texto se haga más grande.

Todos 7 comentarios

En Windows, los caracteres finales de línea de alguna manera no se cuentan en los índices para las selecciones. Actualmente utilizo el siguiente código como solución temporal:

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);
        }

Pero esto definitivamente es un error ...

Sí, he usado el mismo truco que @ManuelHu antes, no es bonito. Todavía no estoy seguro de cómo abordar esto de manera efectiva sin ser un perro lento con texto grande.

Gracias por informar del problema.

Hola @DanWBR ,

Esto debería solucionarse en la última rama de desarrollo. ¿Podrías intentarlo? En todas las plataformas, las nuevas líneas ahora se tratan como un solo carácter \n .

Hola @cwensley , todavía queda un carácter por corregir:

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

Hola @DanWBR , ¿tienes un repro para el apagado por un número? Parece que no puedo reproducirlo.

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

¿Quizás estoy usando índices incorrectos? Sin embargo, funciona en macOS y GTK.

@DanWBR , ah, sí, Text (independientemente de si su texto lo tiene o no). No he encontrado una forma de evitar eso en este momento, pero es un tema separado de este.

Lo que recomendaría es mantener la posición actual en una variable e incrementarla después de agregar texto. El acceso a la propiedad Text cada vez solo para obtener la longitud se ralentizará a medida que el texto se haga más grande.

¿Fue útil esta página
0 / 5 - 0 calificaciones