2017-01-03 6 views
0

私は、RichTextBoxを使って色付きテキストを持つログウィンドウを作った。RichTextBoxログの書き込みパフォーマンスを改善する方法

ボタンを押してShow()を呼び出すまでは、起動時にはHide()が隠れています。

私はTextBlock beforeを使用していましたが、テキストを選択できませんでしたので、RichTextBoxに切り替えました。ほとんど瞬時になる前に、終了時間が5秒増加しました。

プログラムの終了時まで、書き込み速度を向上させるか、すべてのメッセージの書き込みを延期するにはどうすればよいですか?

私が使用してログに何度も書くプログラムを通して:

public partial class MainWindow : Window 
{ 
    public Paragraph paragraph = new Paragraph(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void MyMethod() { 
     rtbLog.Document = new FlowDocument(paragraph); 
     paragraph.Inlines.Add(new LineBreak()); 
     paragraph.Inlines.Add(new Bold(new Run("Log Message Example")) { Foreground = Brushes.Blue }); 
     paragraph.Inlines.Add(new LineBreak()); 
     paragraph.Inlines.Add(new Run("Log Message Example 2") { Foreground = Brushes.White }); 
     this.DataContext = this; 
    } 
} 

<RichTextBox x:Name="rtbLog" HorizontalAlignment="Left" VerticalAlignment="Top" 
      Width="600" Height="400" Margin="246,10,0,0" Padding="10" 
      FontFamily="Consolas" Background="#FF000000" 
      Foreground="White" VerticalScrollBarVisibility="Auto" 
      IsReadOnly="True" IsUndoEnabled="False"/> 

を私はIsUndoEnabled="False"TextOptions.TextFormattingMode="Display"を使用して試してみたの速度を向上させるために、それは1秒で時間が減少している可能性があります。

log console

+1

ここで、リッチテキストボックスコンテンツのバインディングはありますか。 'Show()'のときに、 'StringWriter'のようなバッファに書き込んで、すべてのテキストをrichtextboxに書き出すことをお勧めします。 –

+1

あなたはリストに書き込んで、必要なときにログウィンドウを開いて隠しておくのではなく、明日の回答を書くことができますが、今は窓の電話をしています。 – TheLethalCoder

+0

@ M.kazemAkhgary私はちょうどそれをC#から.Inlines.Add()を使って直接書く。 StringWriterはブッシュの色情報を保存しますか? –

答えて

1

私はいくつかの静的クラスを窓の両方の外側の周りのすべてのログイベントのリストを保持し、クラスのアクセス、それらの両方を聞かせ:

public static class Logs 
{ 
    public static Paragraph Paragraph { get; set; } 

    static Logs() 
    { 
     Paragraph = new Paragraph(); 
    } 
} 

次にあなたが書く必要があるとき

:あなたは、ウィンドウのコールを表示したいときに

public void MyMethod() 
{ 
    Logs.Paragraph.Inlines.Add(new LineBreak()); 
    Logs.Paragraph.Inlines.Add(new Bold(new Run("Log Message Example")) { Foreground = Brushes.Blue }); 
} 

:ログに以下のような何かを

SomeWindow someWindow = new SomeWindow(); 
someWindow.ShowDialog(); //Or show 

次に、RichTextBoxという新しいウィンドウクラスが必要です。開始時に段落を追加してください。

public class SomeWindow : Window 
{ 
    public SomeWindow() 
    { 
     rtbLog.Document = new FlowDocument(Logs.Paragraph); 
    } 
} 
+0

ありがとう、私はそれがどのように進むのかに戻るでしょう。 –

0

コードを調整して書き込みパフォーマンスを解決できました。

rtbLog.Document = new FlowDocument(段落)を複数回使用して1つの問題が発生しました。

  • アクションリストに複数のInline.Add()を挿入します。

  • BeginChange()& EndChange()でforeachループを使用してRichTextBoxにすべてのアクションを書き込むメソッドを作成するメソッド。

  • オプションで、メソッドをBackgroundWorkerに配置します。

スピードはすぐになりました。

List<Action> LogActions = new List<Action>(); 
Action WriteAction; 


// Create Multiple Actions 
WriteAction =() => 
{ 
    paragraph.Inlines.Add(new LineBreak()); 
    paragraph.Inlines.Add(new Bold(new Run("Example")) { Foreground = Brushes.White }); 
}; 
// Add Actions to List 
LogActions.Add(WriteAction); 


// At End of Program or in a Method: 

public void LogWriteAll() { 
    // Write All Actions in List 
    myWindow.rtbLog.Document = new FlowDocument(paragraph); 

    // Begin Rich Textbox Change 
    myWindow.rtbLog.BeginChange(); 

    foreach (Action Write in LogActions) 
    { 
     Write(); 
    } 

    myWindow.rtbLog.EndChange(); 
} 
関連する問題