Saltar al contenido

Cuadro de texto multilínea con desplazamiento vertical automático

Después de mucho batallar ya dimos con el resultado de este conflicto que tantos usuarios de este espacio han presentado. Si deseas aportar algo más no dudes en dejar tu conocimiento.

Solución:

De acuerdo con esta pregunta: TextBox.ScrollToEnd no funciona cuando TextBox está en una pestaña no activa

Tienes que enfocar el cuadro de texto, actualizar la posición del símbolo de intercalación y luego desplazarte hasta el final:

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

EDITAR

Cuadro de texto de ejemplo:


Si lo convierte en un control personalizado simple, entonces no necesita ningún código para hacer el desplazamiento.

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();
    


Si está utilizando WPF, sería mucho mejor usar el enlace en lugar de pasar el cuadro de texto en el código subyacente.

Si no le gusta mucho el código subyacente, aquí hay una propiedad adjunta que hará el truco:

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();
        
    

Y luego en tu xaml solo haz:


Simplemente no olvide agregar en la parte superior de su archivo xaml

xmlns:myAttachedProperties="clr-namespace:YourProject.YourAttachedProperties"

Y voilá

Valoraciones y comentarios

Nos encantaría que puedieras difundir esta sección si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *