0

コンソール アプリケーション用の GUI を作成していて、出力を ListBox に表示したいと考えています。テキストボックスに「時間」と入力し、「送信」と言うボタンをクリックすると、コマンドがコンソールアプリに送信されます。問題は、コマンドが送信されると、リストボックスが自動的に下にスクロールしなくなることです。私は何か間違ったことをしていますか、それとも自動スクロールを処理する別の方法がありますか?

アプリケーションの読み込み中は、適切にスクロールします

スクロール作業

アプリケーションがロードされた後、スクロールが機能しなくなります

ここに画像の説明を入力

アプリケーションがコマンドを取得すると、項目がリストボックスに追加され、AutoScroll メソッドが実行されますが、コードが実行されてもリストボックスは下にスクロールしません。コマンドが送信された後に AutoScroll への呼び出しを追加しようとしましたが、それも機能しません。

    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        server = new Server();
        string ExecPath = @"Server.exe";
        string ConfPath = @"serverconfig.txt";

        //Starts the process and passes the config cmd-line argument
        //redirects output and input, and prevents a cmd window from being created
        server.Start(ExecPath, ConfPath);
        server.SrvProcess.OutputDataReceived += SrvProcess_OutputDataReceived;
        server.SrvProcess.BeginOutputReadLine();
    }

    private void btnSend_Click(object sender, RoutedEventArgs e)
    {
        int itemCount = lstOutput.Items.Count;

        if (!String.IsNullOrEmpty(txtCmd.Text))
        {
            if (lstOutput.Items[itemCount - 1].ToString() != String.Empty)
                lstOutput.Items.Add(String.Empty);

            lstOutput.Items.Add(": " + txtCmd.Text);
            server.SrvProcess.StandardInput.WriteLine(txtCmd.Text);
        }
    }

    void SrvProcess_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
    {
        if (!closing)
        {
            lstOutput.Dispatcher.Invoke(() => AddItem(e.Data));
            lstOutput.Dispatcher.InvokeAsync(() => AutoScroll());
        }
    }

    void AddItem(string Data)
    {
        lstOutput.Items.Add(Data);
        if (Data == "Server started")
        {
            lstOutput.Items.Clear();
        }
    }

    void AutoScroll()
    {
        int itemCount = lstOutput.Items.Count - 1;
        if (itemCount > -1)
            lstOutput.ScrollIntoView(lstOutput.Items[itemCount]);
    }
4

1 に答える 1

0

ScrollIntoView は、行のテキストを使用してスクロールする場所を決定しているように見えます。タイムスタンプを追加してすべての行を一意にすることで、スクロールが適切に機能します。

于 2013-05-29T20:25:58.210 に答える