31

Forms アプリケーションで、大量の出力を生成した、実行時間の長いコマンドライン アプリケーションからのログ出力を表示しています。バックグラウンドでプログラムを起動し、その出力をキャプチャして、現在 AppendText を使用して TextBox に表示しています。たとえば、最後の 1000 行のみを表示することを好みます。TextBox から行を削除するのはコストがかかります。TextBox は、ログ表示をローリングするための最良の方法とは思えません。

Windows フォームでローリング ログ ウィンドウを実行するための最適なコントロールに関するアイデアはありますか?

4

5 に答える 5

16

私はリストボックスにこの種のことをさせていました。行数がたとえば 1000 に達した場合は、最初の行を削除するだけです。ログ行が長すぎる場合は、リストボックスを少し広くすることができます (ログ情報と、最初に表示された行から意味を理解できるかどうかによって異なります)。水平スクロールなしの単語)、水平スクロールバーを表示します。

于 2008-12-20T22:33:48.903 に答える
12

まさに私が必要としていたもの。最後に追加されたアイテムを表示したままにする次のコードで解決しました。

    delegate void UpdateCCNetWindowDelegate(String msg);

     private void Message2CCNetOutput(String message)
     {
         // Check whether the caller must call an invoke method when making method calls to listBoxCCNetOutput because the caller is 
         // on a different thread than the one the listBoxCCNetOutput control was created on.
         if (listBoxCCNetOutput.InvokeRequired)
         {
             UpdateCCNetWindowDelegate update = new UpdateCCNetWindowDelegate(Message2CCNetOutput);
             listBoxCCNetOutput.Invoke(update, message);
         }
         else
         {
             listBoxCCNetOutput.Items.Add(message);
             if (listBoxCCNetOutput.Items.Count > Program.MaxCCNetOutputLines)
             {
                 listBoxCCNetOutput.Items.RemoveAt(0); // remove first line
             }
             // Make sure the last item is made visible
             listBoxCCNetOutput.SelectedIndex = listBoxCCNetOutput.Items.Count - 1;
             listBoxCCNetOutput.ClearSelected();
         }
     }
于 2008-12-21T12:30:05.453 に答える
7

同じニーズがあり、この助けに大いに感謝しています。これは少し変更されたバージョンです。

リストボックスを作成します。

<ListBox x:Name="lbLog" Background="LightGray"></ListBox>

メイン スレッド (コードの最初の部分) で、UI スレッドへの参照を格納するためにこれを配置します。

Thread m_UIThread;
....
m_UIThread = Thread.CurrentThread;

次に、これはログ メソッドであり、任意のスレッドから呼び出すことができます。

public void AddToLog(String message)    
{
    if (Thread.CurrentThread != m_UIThread)
    {
        // Need for invoke if called from a different thread
        this.Dispatcher.BeginInvoke(
            DispatcherPriority.Normal, (ThreadStart)delegate()
            {
                AddToLog(message);
            });
    }
    else
    {
        // add this line at the top of the log
        lbLog.Items.Insert(0, message);

        // keep only a few lines in the log
        while (lbLog.Items.Count > LOG_MAX_LINES)
        {
            lbLog.Items.RemoveAt(lbLog.Items.Count-1);
        }
    }
}
于 2009-09-20T15:53:04.053 に答える
3

私はしばらく前にこれを行う必要があり、リストボックスが解決策でした。誰もその違いに気付かないでしょう。

于 2008-12-20T22:44:53.250 に答える
2

非常に単純な解決策

Textbox1.Appendtext(<yourtext>)

コンソールのようなローリング ログ用

于 2012-01-19T12:52:49.613 に答える