Как я могу сделать прокрутку RichTextBox до конца, когда я добавляю новую строку?

У меня есть только чтение RichTextBox только для чтения. Поскольку они прочитаны только, они не отображаются автоматически, когда текст обновляется. Я могу использовать событие TextChanged для принудительного завершения прокрутки, но разве не просто способ установить свойство или что-то в XAML, чтобы прокрутка происходила, как обычно?

Ответ 1

У меня была проблема с Google, и я нашел эту статью. В разделе "Программирование RichTextBox" автор описал, как получить поведение, чего вы ожидали.

Пожалуйста, проверьте и дайте мне знать, если это будет полезно.


Я попытался воспроизвести вашу проблему и придумал следующее решение

    <Window x:Class="CheckRichTextBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="170" Width="300">
    <StackPanel>
        <RichTextBox Height="100" Name="richTextBox1" IsReadOnly="True" VerticalScrollBarVisibility="Visible"/>
        <Button Name="btnAdd" Content="Click me to add text" VerticalAlignment="Bottom" Click="BtnAddClick" />
    </StackPanel>
</Window>

Код за тем же, что и ниже:

using System.Windows;

namespace CheckRichTextBox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void BtnAddClick(object sender, RoutedEventArgs e)
        {
            richTextBox1.AppendText("You had Clicked the button for adding text\n");
            richTextBox1.ScrollToEnd();
        }
    }
}

Это решает проблему автопрокрутки, пожалуйста, проверьте ее и сообщите мне, если это поможет.

Ответ 2

Я решил эту проблему, используя Interactivity триггер и очень простое действие.

Действие выглядит следующим образом:

public class ScrollToBottomAction : TriggerAction<RichTextBox>
{
    protected override void Invoke(object parameter)
    {
        AssociatedObject.ScrollToEnd();
    }
}

Тогда в моем XAML у меня есть это:

<RichTextBox IsReadOnly="True" VerticalScrollBarVisibility="Auto">
     <i:Interaction.Triggers>
            <i:EventTrigger EventName="TextChanged">
                <interactivity:ScrollToBottomAction/>
            </i:EventTrigger>
     </i:Interaction.Triggers>
</RichTextBox>

Ответ 3

RichTextBox.AppendText("String")
RichTextBox.ScrollToCaret()

Когда я добавлял RichTextBox.text, ScrollToCaret() не работает.

RichTextBox.text = RichTextBox.text + "String"
RichTextBox.ScrollToCaret()