Domanda

Quale sarebbe un buon approccio per visualizzare e modificare grandi quantità di testo non formattato (proprio come fa Notepade) usando WPF? Il caricamento di una stringa di grandi dimensioni in una TextBox rende l'interfaccia utente non rispondente. Le prestazioni complessive non sono quasi comparabili con i controlli TextBox dei precedenti frame dell'interfaccia utente Microsoft.

Quali opzioni ho per risolvere questo problema. Non voglio bloccare il thread dell'interfaccia utente mentre il controllo del testo carica il testo. Inoltre potrei aver bisogno di una sorta di "virtualizzazione" perché potrebbe non essere una buona idea caricare l'intero testo nel controllo (suppongo che 20 MB di testo creerebbero molti glifi anche se non sono visibili). Sembra che TextBox non abbia più nemmeno un metodo AppenText (), quindi non ho nemmeno un modo per controllare il caricamento asincrono del testo.

Non è questo un problema comune? Sembra che WPF non fornisca nulla per questo immediatamente. Perché è così?

È stato utile?

Soluzione

AvalonEdit, l'editor di testo in SharpDevelop, è stato scritto completamente da zero in WPF ed è ottimizzato per grandi quantità di testo. Non supporta il rich text (sebbene supporti l'evidenziazione della sintassi e altre interessanti funzioni come la piegatura). Penso che questo potrebbe adattarsi perfettamente al tuo conto.

Ecco un articolo sull'editor scritto dallo sviluppatore:

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

Altri suggerimenti

Non sono sicuro che questo aiuti, ma hai provato a usare FlowDocumentPageViewer e FlowDocumentReader ?

Ha anche un ottimo supporto per le annotazioni e sembra ideale per caricare documenti in formato testo.

Il problema è che TextBox è un singolo elemento contenitore. I controlli elenco, come ListBox, si virtualizzano molto bene a causa del riciclaggio dei contenitori. Non c'è davvero nulla di semplice che puoi fare per accelerare TextBox.

Ma il controllo TextBox ha un metodo AppendText ():

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

Quindi sì, puoi usarlo per aggiungere in modo dinamico del testo proprio come hai menzionato.

Puoi semplicemente usare una casella di testo con uno stile che offre all'utente più spazio per visualizzare il testo. Probabilmente ci sono controlli più avanzati da Telerik e altri, ma se non hai bisogno di opzioni di modifica che dovrebbero bastare.

Puoi sempre mescolare e abbinare le tecnologie: puoi rilasciare una TextBox WinForms su un genitore WPF. Perdi cose come lo stile, l'opacità, l'animazione, le trasformazioni, ecc., Ma se tutto ciò che conta è la modifica del testo, WinForms TextBox lo fa bene.

Hai provato WPF RichTextBox ? Avrai sicuramente bisogno di leggere le informazioni FlowDocument se segui questa strada.

È possibile utilizzare FlowDocument , ma questo non funziona immediatamente per associare la proprietà Documento di un FlowDocument in MVVM .

Un'altra soluzione sta usando FlowDocumentScrollViewer e si lega alla sua proprietà Documento .

(o potresti persino usare un FlowDocumentReader e associare la sua proprietà Documento , simile alla FlowDocumentScrollViewer . Ciò ti offre un'interfaccia utente diversa. )

La vista:

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

ViewModel:

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

consulta anche questo per ulteriori suggerimenti sulle prestazioni: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-text#flowdocument-textblock-and-label-controls

Che ne dici di provare qualcosa del genere:

Mantieni l'intera stringa in memoria ma mostra solo una 'fetta' di essa nella casella di testo. La dimensione della stringa tranciata sarebbe calcolata in modo dinamico in base alla dimensione della casella di testo, alla dimensione del carattere ecc.

Ovviamente questo implica un sacco di codice non banale per una corretta visualizzazione, sincronizzazione e così via, ma sembra la strada da percorrere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top