.net 如何使带有滚动条的WPF文本框在添加行时自动滚动到底部?

.net 如何使带有滚动条的WPF文本框在添加行时自动滚动到底部?,.net,wpf,scroll,.net,Wpf,Scroll,例如,就像VisualStudio的“输出”窗口一样 在XAML中有什么方法可以做到这一点吗?您可以编写一个或更好的a来侦听回调中的和。您可以在向该文本框添加内容时或在侦听事件TextChanged时使用此方法: .Visual Studio输出窗口的行为是特殊的,因为只有插入符号位于文本框的末尾时,它才会保持自动向下滚动,这样,如果在文本框中添加新行,您就可以在不受干扰的情况下检查输出 我在这个代码中有这样的行为 bool scrollToEnd = TbEvents.CaretIndex =

例如,就像VisualStudio的“输出”窗口一样


在XAML中有什么方法可以做到这一点吗?

您可以编写一个或更好的a来侦听回调中的和。

您可以在向该文本框添加内容时或在侦听事件TextChanged时使用此方法:
.

Visual Studio输出窗口的行为是特殊的,因为只有插入符号位于文本框的末尾时,它才会保持自动向下滚动,这样,如果在文本框中添加新行,您就可以在不受干扰的情况下检查输出

我在这个代码中有这样的行为

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

在XAML中有一种方法可以做到这一点,您可以使用这种样式像控制台一样显示它(请注意其缺点,它看起来像控制台,但并不完全像控制台)


它是如何工作的

在文本框内,一个ScrollViewer垂直翻转(在底部添加“新”行)

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

使用样式

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

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

缺点

  • 从“控制台”复制文本时,不会出现换行符
  • 用鼠标滚动是反向的

仅通过XAML指定肯定是正确的答案!我尝试过这种方法,但鼠标滚轮的动作是反向的。这就是我吗?如果没有,修复方法是什么?我想您必须创建一个自定义的
ScrollViewer
,它处理预览鼠标滚轮(MouseWheelEventArgs e)事件,并反转Delta属性。在我看来,这种解决方案最终比选择
ScrollToEnd()
更糟糕。。。你仍然有C#codebehind,这是试图避免的。
<TextBox Style="{StaticResource ConsoleTextBox}"/>