Pregunta

¿Cuál sería un buen enfoque para visualizar y editar gran cantidad de texto sin formato (como lo hace notepade) usando WPF? Cargar una cadena grande en un cuadro de texto hace que la IU no responda. El rendimiento general no es casi comparable con los controles TextBox de los marcos de interfaz de usuario de Microsoft anteriores.

¿Qué opciones tengo para resolver este problema? No quiero bloquear el hilo de la IU mientras el control de texto carga el texto. También podría necesitar algún tipo de " virtualización " porque podría no ser una buena idea cargar todo el texto en el control (supongo que 20 MB de texto crearían muchos glifos, incluso si no son visibles). Parece que TextBox ya no tiene un método AppenText (), así que ni siquiera tengo una manera de controlar la carga asíncrona del texto.

¿No es este un problema común? Parece que WPF no proporciona nada para esto fuera de la caja. ¿Por qué esto es tan?

¿Fue útil?

Solución

AvalonEdit, el editor de texto en SharpDevelop, fue escrito completamente desde cero en WPF y está optimizado para grandes cantidades de texto. No admite texto enriquecido (aunque sí admite resaltado de sintaxis y otras funciones interesantes, como el plegado). Creo que esto podría ajustarse perfectamente a su factura.

Aquí hay un artículo sobre el editor escrito por el desarrollador:

http://www.codeproject.com/KB/edit/AvalonEdit.aspx

Otros consejos

No estoy seguro de si esto ayuda, pero ha intentado usar FlowDocumentPageViewer y FlowDocumentReader ?

También tiene un soporte de anotaciones muy bueno y parece ideal para cargar documentos en formato de texto.

El problema es que el TextBox es un elemento contenedor único. Los controles de lista, como ListBox, se virtualizan muy bien debido al reciclaje de contenedores. Realmente no hay nada simple que puedas hacer para acelerar el TextBox.

Pero el control TextBox tiene un método AppendText ():

        TextBox tb = new TextBox();
        tb.AppendText("Hello");

Así que sí, puedes usar esto para agregar dinámicamente un texto como lo mencionaste.

Puede usar un cuadro de texto con un estilo que le da al usuario más espacio para ver el texto. Probablemente haya controles más avanzados de Telerik y otros, pero si no necesita opciones de edición que sean suficientes.

Siempre puede mezclar y combinar tecnologías: puede colocar un WinForms TextBox en un elemento primario de WPF. Pierdes cosas como el estilo, la opacidad, la animación, las transformaciones, etc., pero si lo único que importa es editar el texto, el WinBorms TextBox lo hace muy bien.

¿Has probado el WPF RichTextBox ? Definitivamente, querrás leer la información de FlowDocument si vas por esta ruta.

Puede usar FlowDocument , pero esto no funciona de manera automática para vincularse a la propiedad Documento de un FlowDocument en MVVM .

Otra solución es utilizar FlowDocumentScrollViewer y enlazar a su propiedad Documento .

(o incluso podría usar un FlowDocumentReader y enlazar su propiedad Document , similar a la FlowDocumentScrollViewer . Esto le da una interfaz de usuario diferente. )

La vista:

 <FlowDocumentScrollViewer Document="{Binding FlowDocument, Mode=OneWay}" />

El modelo de vista:

   FlowDocument fd = new FlowDocument();
        Paragraph p = new Paragraph();
        Run r = new Run();
        r.Text = "large text";
        p.Inlines.Add(r);
        fd.Blocks.Add(p);
        FlowDocument = fd;

 private FlowDocument _FlowDocument;
    public FlowDocument FlowDocument
    {
      get{ return _FlowDocument; }
      set
      {
        _FlowDocument = value;
        NotifyOfPropertyChange(nameof(FlowDocument));
      }
    }

vea también esto para obtener sugerencias de rendimiento adicionales: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-text#flowdocument-textblock-and-label-controls

¿Qué tal si intentas algo como esto?

Mantenga toda la cadena en la memoria, pero muestre solo una 'porción' de ella en el cuadro de texto. El tamaño de la cadena dividida se calculará dinámicamente según el tamaño del cuadro de texto, el tamaño de la fuente, etc.

Por supuesto, esto implica una gran cantidad de código no trivial para una correcta visualización, sincronización, etc., pero parece ser el camino a seguir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top