Multiline Textbox with automatic vertical scroll
According to this question: TextBox.ScrollToEnd doesn't work when the TextBox is in a non-active tab
You have to focus the text box, update the caret position and then scroll to end:
Status.Focus();Status.CaretIndex = Status.Text.Length;Status.ScrollToEnd();
EDIT
Example TextBox:
<TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" AcceptsReturn="True" Name="textBox"/>
If you make it into a simple custom control then you don't need any code behind to do the scrolling.
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(); }}
If you're using WPF it would be far better to use binding rather than passing the text box around in the code behind.
If you don't like code behind to much, here is an AttachedProperty that will do the trick :
namespace YourProject.YourAttachedProperties{ public class TextBoxAttachedProperties { public static bool GetAutoScrollToEnd(DependencyObject obj) { return (bool)obj.GetValue(AutoScrollToEndProperty); } public static void SetAutoScrollToEnd(DependencyObject obj, bool value) { obj.SetValue(AutoScrollToEndProperty, value); } // Using a DependencyProperty as the backing store for AutoScrollToEnd. This enables animation, styling, binding, etc... public static readonly DependencyProperty AutoScrollToEndProperty = DependencyProperty.RegisterAttached("AutoScrollToEnd", typeof(bool), typeof(TextBoxAttachedProperties), new PropertyMetadata(false, AutoScrollToEndPropertyChanged)); private static void AutoScrollToEndPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if(d is TextBox textbox && e.NewValue is bool mustAutoScroll && mustAutoScroll) { textbox.TextChanged += (s, ee)=> AutoScrollToEnd(s, ee, textbox); } } private static void AutoScrollToEnd(object sender, TextChangedEventArgs e, TextBox textbox) { textbox.ScrollToEnd(); } }}
And then in your xaml just do :
<TextBox AcceptsReturn="True" myAttachedProperties:TextBoxAttachedProperties.AutoScrollToEnd="True"/>
Just don't forget to add at the top of your xaml file
xmlns:myAttachedProperties="clr-namespace:YourProject.YourAttachedProperties"
And voila