我使用RichTextBox
制作了带有彩色文字的日志窗口。
它会在开始时运行隐藏Hide()
,直到您按下按钮将其显示为Show()
。
我使用的是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秒。
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
我能够通过调整代码来解决写入性能。
一个问题是多次使用rtbLog.Document = new FlowDocument(段落)。
将多个Inline.Add()放入动作列表中。
创建方法,使用带有BeginChange()&amp;的foreach循环将所有动作写入RichTextBox EndChange()。
现在速度很快。
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();
}