带自动垂直滚动的多行文本框

在互联网上有很多类似的问题,包括SO,但提出的解决scheme在我的情况下不起作用。 场景: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,select和插入变通办法,将ScrollToEnd附加到TextChanged。 没有这个工程,执行后溢出文本框高度仍然需要滚动手动。 对不起,重复的问题,我想我错过了一些小问题,可以迅速解决问题的新鲜眼光的人。 提前致谢。

根据这个问题: 当TextBox处于非活动选项卡时,TextBox.ScrollToEnd不起作用

您必须对焦文本框,更新插入位置,然后滚动至结束:

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

编辑

示例文本框:

 <TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" AcceptsReturn="True" Name="textBox"/> 

如果你把它变成一个简单的自定义控件,那么你不需要任何代码来做滚动。

 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,那么使用绑定会比在后面的代码中传递文本框要好得多。

谢谢! 我已经添加了这个来记住原来的重点:

 var oldFocusedElement = FocusManager.GetFocusedElement(this); this.textBox.Focus(); this.textBox.CaretIndex = this.textBox.Text.Length; this.textBox.ScrollToEnd(); FocusManager.SetFocusedElement(this, oldFocusedElement);