Как заставить WPF TextBox с полосой прокрутки автоматически прокручивать нижнюю часть при добавлении строк?

Например, например, в окне Visual Studio "Выход".

Есть ли способ сделать это в XAML?

Ответ 1

Вы можете всякий раз, когда вы добавляете контент в этот TextBox или когда вы слушаете событие TextChanged, этот метод: TextBoxBase.ScrollToEnd().

Ответ 3

Поведение выходного окна Visual Studio является особенным, потому что оно будет удерживать автоматическую прокрутку вниз, если каретка находится в конце текстового поля, что позволяет вам проверять вывод без нарушения, если к нему добавляются новые строки.

У меня такое поведение с этим кодом

bool scrollToEnd = TbEvents.CaretIndex == TbEvents.Text.Length;
TbEvents.AppendText(text + Environment.NewLine);
if (scrollToEnd)
{
    TbEvents.CaretIndex = TbEvents.Text.Length;
    TbEvents.ScrollToEnd();
}

Ответ 4

Есть способ сделать это в XAML, вы можете использовать этот стиль, чтобы отобразить его так, как это делает консоль (знайте о недостатках, он просто выглядит как консоль, но ведет себя не совсем так, как он)

        <Style x:Key="ConsoleTextBox" TargetType="{x:Type TextBox}">
            <Setter Property="IsReadOnly" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <ScrollViewer RenderTransformOrigin="0.5,0.5" VerticalScrollBarVisibility="Auto">
                            <ScrollViewer.RenderTransform>
                                <ScaleTransform ScaleY="-1"/>
                            </ScrollViewer.RenderTransform>
                            <TextBox Text="{TemplateBinding Text}" RenderTransformOrigin="0.5,0.5">
                                <TextBox.RenderTransform>
                                    <ScaleTransform ScaleY="-1"/>
                                </TextBox.RenderTransform>
                            </TextBox>
                        </ScrollViewer>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Как это работает

Внутри TextBox ScrollViewer переворачивается вертикально ("новые" строки добавляются внизу)

В ScrollViewer есть еще одно текстовое поле, которое перевернуто по вертикали для правильного отображения текста (не вверх ногами).

Используя Стиль

Включите его в свой App.xaml или через ResourceDictionary и установите для стиля TextBox значение ConsoleTextBox.

<TextBox Style="{StaticResource ConsoleTextBox}"/>

Недостатки

  • Когда вы копируете текст из этой "консоли", не будет разрывов строк.
  • Прокрутка с помощью мыши перевернута