46

SOを含め、インターネット上で同様の質問がたくさんありますが、提案された解決策は私の場合は機能しません。シナリオ: xaml にログ テキスト ボックスがあります。

 <TextBox Name="Status"
          Margin="5"
          Grid.Column="1"
          Grid.Row="5"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          Width="600"
          Height="310"/>

コード ビハインドには、いくつかの作業を行い、複数行の (おそらくそれが問題なのでしょうか?) メッセージをこのテキスト ボックスに追加するメソッドがあります。

private static void DoSomeThings(TextBox textBox)
{
   // do work
   textBox.AppendText("Work finished\r\n"); // better way than Text += according to msdn
   // do more
   textBox.AppendText("One more message\r\n");
   ...
}

private static void DoSomething2(TextBox textBox)
{
   // same as first method
}

すべてのアクションが実行された後、テキスト ボックスの一番下までスクロールする必要があります。ScrollToEnd()、ScrollToLine、テキスト ボックスを ScrollViewer にラップすること、Selection および Caret の回避策、ScrollToEnd を TextChanged にアタッチすることを試しました。テキストボックスの高さを超える行を実行した後も、手動でスクロールする必要があります。質問が重複して申し訳ありません。問題について新鮮なビジョンを持っている人がすぐに解決できる小さな問題がいくつか欠けていると思います。前もって感謝します。

4

4 に答える 4

87

この質問によると:TextBoxが非アクティブなタブにある場合、TextBox.ScrollToEndは機能しません

テキストボックスにフォーカスを合わせ、キャレットの位置を更新してから、最後までスクロールする必要があります。

Status.Focus();
Status.CaretIndex = Status.Text.Length;
Status.ScrollToEnd();

編集

テキストボックスの例:

<TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" 
         AcceptsReturn="True" Name="textBox"/>
于 2012-01-20T09:12:53.870 に答える
17

シンプルなカスタム コントロールにする場合は、スクロールを行うためのコード ビハインドは必要ありません。

public class ScrollingTextBox : TextBox {

    protected override void OnInitialized (EventArgs e) {
        base.OnInitialized(e);
        VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
        HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
    }

    protected override void OnTextChanged (TextChangedEventArgs e) {
        base.OnTextChanged(e);
        CaretIndex = Text.Length;
        ScrollToEnd();
    }

}

WPF を使用している場合は、コード ビハインドでテキスト ボックスを渡すよりもバインディングを使用する方がはるかに優れています。

于 2014-02-13T13:03:50.607 に答える