我正在尝试将输出监视器添加到我的WPF应用程序中。 一个只读监视器,类似于visual studio中的调试输出。
是否有WPF控件已经提供了我需要的功能? 或者有没有办法可以重用Visual Studio中的控件?
目前我使用的是StringBuilder支持的标准TextBox。更新进入StringBuilder,而TextBox每200ms获取最新的字符串。
我的问题是随着输出字符串变长,这变得非常慢。
答案 0 :(得分:2)
我会使用RichTextBox控件输出数据。
在这个示例中,我对性能没有任何问题。
public partial class MainWindow : Window
{
private int counter = 0;
public MainWindow()
{
InitializeComponent();
Loaded+=OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
for (int i = 0; i < 200; i++)
{
AddLine(counter++ + ": Initial data");
}
var timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 0, 0, 200);
timer.Tick += TimerOnTick;
timer.IsEnabled = true;
}
private void TimerOnTick(object sender, EventArgs eventArgs)
{
AddLine(counter++ + ": Random text");
}
public void AddLine(string text)
{
outputBox.AppendText(text);
outputBox.AppendText("\u2028"); // Linebreak, not paragraph break
outputBox.ScrollToEnd();
}
}
和XAML
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<RichTextBox x:Name="outputBox"
VerticalScrollBarVisibility="Visible"
HorizontalScrollBarVisibility="Visible"
IsReadOnly="True">
<FlowDocument/>
</RichTextBox>
</Grid>
</Window>
扩展它可能很容易。例如,如果滚动位置不在末尾,请不要滚动到结尾,以便在文本框仍在更新时查看旧数据。