Autor Beitrag
daengl
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 24.05.08 17:42 
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
daengl Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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