如何在WinRT中编程实现自动滚动到TextBox的底部?

7

我正在编写一个简单的WinRT应用程序,但我遇到了麻烦,无法找到自动滚动到代码中TextBox底部的方法。我将日志信息写入TextBox,并希望它可以滚动,以便在框中可见最新条目,但是似乎没有任何作用。以下是我尝试过的几种方法:

将TextBox放置在ScrollViewer中:

this.txtLog.Text = this.txtLog.Text + line + "\r\n";
ScrollToVerticallOffset(scrollView.ScrollableHeight);

选择文本框中的最后一条数据:

this.txtLog.Select(this.txtLog.Text.Length, 0);

但是我所做的任何操作都无法使显示的文本自动滚动,以便底部的数据可见。

有人有什么想法吗?


请注意,您正在调用 ScrollToHorizontalOffset 而不是 ScrollToVerticalOffset,并且在设置文本后可能需要等待文本框的布局更新。 - Filip Skakun
抱歉,那实际上是我在将代码翻译到这里时打错了一个字。在我的实际代码中,我使用了“ScrollToVerticalOffset”。我正在更正我的原始帖子。 - Briggs
1个回答

4

This works:

XAML

<TextBox
    x:Name="tb"....

C#

var sv = tb.GetFirstDescendantOfType<ScrollViewer>();
sv.ScrollToVerticalOffsetWithAnimation(sv.ExtentHeight - sv.ViewportHeight);

这是使用Winrt XAML Toolkit的方法。

没有工具包的方式:

Func<DependencyObject, ScrollViewer> getFirstDescendantScrollViewer = null;
getFirstDescendantScrollViewer =
    parent =>
    {
        var c = VisualTreeHelper.GetChildrenCount(parent);

        for (int i = 0; i < c; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            var sv = child as ScrollViewer;
            if (sv != null)
                return sv;
            sv = getFirstDescendantScrollViewer(child);
            if (sv != null)
                return sv;
        }

        return null;
    };

var tbsv = getFirstDescendantScrollViewer(tb);
tbsv.ScrollToVerticalOffset(tbsv.ScrollableHeight);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接