7

WPFアプリケーションに出力モニターを追加しようとしています。VisualStudioのデバッグ出力に似た読み取り専用モニター。

必要な機能をすでに提供しているWPFコントロールはありますか?または、Visual Studioのコントロールを再利用する方法はありますか?

現在、StringBuilderに基づく標準のTextBoxを使用しています。TextBoxが200msごとに最新の文字列を取得している間、更新はStringBuilderに送られます。

私の問題は、出力文字列が長くなるにつれて、これが非常に遅くなることです。

4

1 に答える 1

3

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>

そして、それを拡張するのはおそらく簡単です。スクロール位置が最後にない場合は、たとえば最後までスクロールしないでください。テキストボックスの更新中に古いデータを表示できます。

于 2012-12-18T14:03:32.537 に答える