如何使用滚动条使WPF TextBox在添加行时自动滚动到底部?

时间:2011-08-10 12:02:29

标签: .net wpf scroll

例如像Visual Studio“输出”窗口那样。

有没有办法在XAML中执行此操作?

4 个答案:

答案 0 :(得分:45)

您可以随时向该TextBox添加内容,或者当您收听事件时,TextChanged会触发此方法: TextBoxBase.ScrollToEnd()

答案 1 :(得分:8)

你可以写一个attached property甚至更好的behavior来收听回调中的TextChanged eventscrolls to the bottom

答案 2 :(得分:3)

Visual Studio输出窗口行为是特殊的,因为如果插入符号位于文本框的末尾,它将仅保持自动向下滚动,这允许您在不添加新行的情况下检查输出而不会受到干扰。 / p>

我有这个代码的行为

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

答案 3 :(得分:3)

有一种方法可以在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垂直翻转(&#34;新的&#34;行添加在底部)

在ScrollViewer中,还有另一个文本框,可以垂直翻转以正确显示文本(不是颠倒)。

使用样式

将其包含在App.xaml中或通过ResourceDictionary包含,并将TextBox的样式设置为ConsoleTextBox。

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

<强>缺点

  • 从此&#34;控制台&#34;复制文本时没有换行符。
  • 使用鼠标滚动