Multiline Textbox with automatic vertical scroll Multiline Textbox with automatic vertical scroll wpf wpf

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