Entwickler-Ecke

WPF / Silverlight - RichTextBox Geschwindigkeit


daengl - Sa 24.05.08 17:42
Titel: RichTextBox Geschwindigkeit
Hallo alle zusammen,

Ich verwende in meiner GUI eine RichTextBox zur Darstellung von diversen Textdokumenten (es kommt später noch Syntaxhighlighting hinzu, deshalb RTB). Nun habe ich das Problem dass ich sehr große Textdateien habe (bis zu 2MB), bei welchen die RTB sehr lange benötigt, um diese darzustellen (habe gerade einen Vergleich gestartet, WindowsForms-RTB benötigt ca. 1,25 Sekunden, WPF-RTB ca. 2 Minuten(!) bei 1,7MB-Textdatei).

Kennt irgendjemand Möglichkeiten, eine WPF-RTB für Textdarstellung mit Syntax-Highlighting zu optimieren?


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am So 25.05.2008 um 19:04


Christian S. - Mo 26.05.08 12:15

Hallo!

Dass WPF an manchen Stellen nicht unbedingt rasend schnell ist, ist ja leider bekannt. Da wird ja aber dran gearbeitet [http://www.c-sharp-forum.de/topic_Visual+Studio+2008+and+NET+Framework+35+SP1+Beta_83349.html].

Ist die Performance nur beim Befüllen der Box schlecht oder auch, wenn der Tex einmal drin ist. Vielleicht zeigst Du einfach mal ein bisschen Code, wie Du die Box befüllst. Eventuell kann man da was rausholen :-)

Grüße
Christian

P.S.: Respekt, wenn Du mit der WPF-RichTextBox arbeitest. Irgendwie war mir die zu aufwändig :D


daengl - Mo 26.05.08 19:37

Die Geschwindigkeit ist auch nach dem Befüllen nicht brauchbar (beim Scrollen pro Zeile ca. 3 Sekunden).

Ich habe mir zum Testen eine kleine Applikation gebastelt, welche nur beim Drücken auf einen Button eine Datei in die RTB einliest:

Beim Klicken auf den Button passiert folgendes:


C#-Quelltext
1:
2:
3:
4:
5:
6:
richTextBox1.Document.Blocks.Clear();
string content = File.ReadAllText(@"e:\testprojekt\L568.h");
DateTime start = DateTime.Now;
richTextBox1.AppendText(content);
TimeSpan diff = DateTime.Now - start;
MessageBox.Show("Benötigte Zeit: " + diff.ToString());


Die RTB erstelle ich mit:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <RichTextBox Margin="0,0,0,63" Name="richTextBox1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"/>
        <Button Height="36" Name="button1" VerticalAlignment="Bottom" Click="button1_Click">Button</Button>
    </Grid>
</Window>


Der Aufwand hält sich (noch) in Grenzen, außerdem arbeite ich nicht produktiv damit, sondern das ist ein privates Projekt, bei dem ich alles Mögliche neue im Framework 3.5 bzw. WPF ausprobiere :D


daengl - Mi 28.05.08 19:02

Falls sonst noch jemand das Problem hat: Mir ist eine Lösung zugetragen worden, mit der das Einlesen des Textes in die RTB viel schneller geht.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
richTextBox1.Document.Blocks.Clear(); 

FlowDocument doc = new FlowDocument();
Paragraph para = new Paragraph();

string content = File.ReadAllText(@"e:\testprojekt\L568.h");

string[] lines = content.Split(new[] { "\r\n" }, StringSplitOptions.None);

foreach (string line in lines)
{
    para.Inlines.Add(new Run(line));
    para.Inlines.Add(new LineBreak());
}

doc.Blocks.Add(para);
richTextBox1.Document = doc;


Kha - Mi 28.05.08 20:07

Interessant, wie viel genau ist "viel schneller" im Vergleich zu deinem ersten Ansatz?
Den ersten Code könntest du auch noch einmal mit einem BeginChange/EndChange-Paar testen. Hat zwar eine andere Bedeutung als in Delphi, dürfte aber auch helfen. An deinen zweiten Code wird es wahrscheinlich trotzdem nicht herankommen.

PS: File.ReadAllLines


daengl - Mi 28.05.08 23:31

viel schneller bedeutet 2 Minuten zu 7 Sekunden

ich werde am wochenende noch ein wenig damit herumprobieren, falls ich noch was rausfinde werde ich es hier noch reinschreiben