2016-08-22 1 views
1

Ich habe eine RichTextBlock in meinem Projekt UWP, wenn ich lange Zeichenfolge wie es Inhalt ist, dauert es lange, um Inhalte wie 3 Sekunden anzuzeigen. Ich suchte im Internet und fand, weil es virtualization nicht hat, will es alle Inhalte rendern. Es scheint, dass dieses Problem in WPF und RichTextBox vorhanden ist.Langsames Laden auf RichTextBlock durch langen String

Können Sie mir vorschlagen, was ich tun soll, um nur visuellen Inhalt zu rendern?

+0

Wie lange ist Ihre Zeichenfolge? Ich testete mit 12000 Zeichenkette und es rendert sofort auf Knopfdruck. –

+0

Verwenden Sie Visual Studio Profiler, um zu überprüfen, was so viel Zeit in Anspruch nimmt. 3 Sekunden sind zu lang. Überprüfen Sie auch, ob es einen Unterschied macht, im Release-Modus statt Debug zu laufen. –

Antwort

1

Ich würde den Inhalt nach Absätzen teilen und sie einzeln in ListView rendern.

<ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <RichTextBlock /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

Ich habe einen langen Absatz nicht mehrere – Maryam

+0

@Maryam Vielleicht sollten Sie nicht einen wirklich langen Absatz haben. – Paparazzi

+0

Ich habe getestet und ich als 36.000 + Zeichen hinzugefügt und es immer noch sofort gerendert..at 42000 Zeichenkette gab es Ausnahme .. Also gibt es noch etwas verlangsamt den Code –

0

Drehen Sie Ihre lange Zeichenfolge in eine Liste kleinerer Zeichenfolgen List<string> strList. Immer wenn der ScollViewer das Ende erreicht, wird mehr Text geladen (im selben Absatz).

<ScrollViewer Name="Scroll" 
      ViewChanged="Scroll_OnViewChanged"> 
     <StackPanel> 
      <RichTextBlock> 
       <Paragraph x:Name ="P"></Paragraph> 
      </RichTextBlock> 
     </StackPanel> 
    </ScrollViewer> 

.

private void Scroll_OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
      { 
       var scroller = (ScrollViewer) sender; 

       if (scroller.ScrollableHeight-scroller.VerticalOffset > 5) return;  
       if (pointer >= strList.Count) return; 

       var run = new Run {Text = strList[pointer++]}; 

       P.Inlines.Add(run); 
      } 

pointer ist nur eine private Klasse Feld vom Typ int.

+0

weil ich Suchseite habe und vielleicht möchte ich Ende der Seite gehen, das ist wieder langsam. – Maryam

Verwandte Themen