UWP C# 滚动到 TextBox 底部

5

如何为UWP应用程序滚动到TextBox底部?

随着我转向UWP,这是一个不太简单的问题。

我以前可以使用这个方法:

textBox.SelectionStart = textBox.TextLength;
textBox.ScrollToCaret();

但是,这对于UWP应用程序无效。
3个回答

6

使用来自https://code.msdn.microsoft.com/windowsapps/How-to-scroll-to-the-a8ea5867的答案有时会导致向上滚动时删除行。

为解决此问题,请尝试以下方法:

private void ScrollToBottom(TextBox textBox)
{
    var grid = (Grid)VisualTreeHelper.GetChild(textBox, 0);
    for (var i = 0; i <= VisualTreeHelper.GetChildrenCount(grid) - 1; i++)
    {
        object obj = VisualTreeHelper.GetChild(grid, i);
        if (!(obj is ScrollViewer)) continue;
        ((ScrollViewer)obj).ChangeView(0.0f, ((ScrollViewer)obj).ExtentHeight, 1.0f, true);
        break;
    }
}

主要的区别在于这一行代码:
((ScrollViewer)obj).ChangeView(0.0f, ((ScrollViewer)obj).ExtentHeight, 1.0f, true);

我将方法与事件处理程序分开,因为我不想每次更改文本时都必须滚动。

2
这也可以用于ScrollToCaret。你通过行终止符拆分字符串,以获取总行数,然后遍历字符串的字符,计算行结束符的数量,直到达到文本SelectionStart位置,然后将总行数除以所在行数。你可以使用该百分比乘以ExtentHeight,然后瞬间到达插入符号。 - b.pell

5
如果有人需要在UWP应用程序中滚动到TextBox的底部:

https://code.msdn.microsoft.com/windowsapps/How-to-scroll-to-the-a8ea5867

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    var grid = (Grid)VisualTreeHelper.GetChild(textBox1, 0); 
    for (var i = 0; i <= VisualTreeHelper.GetChildrenCount(grid) - 1; i++) 
        { 
            object obj = VisualTreeHelper.GetChild(grid, i); 
            if (!(obj is ScrollViewer)) continue; 
            ((ScrollViewer)obj).ChangeView(0.0f, ((ScrollViewer)obj).ExtentHeight, 1.0f); 
            break; 
        } 
    }
}

其中textBox1是您想要滚动到底部的文本框。


文本框必须具有属性AcceptReturn="True"。 - Emanuele Leoni

1

在 C++/CX 中,与前面答案等效的代码如下:

using Windows::UI::Xaml::Media::VisualTreeHelper;
using Windows::UI::Xaml::Controls::Grid;
using Windows::UI::Xaml::Controls::ScrollViewer;
using Platform::Object;

void
MainPage::responseTextUpdated(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    Grid^ grid = static_cast<Grid^>(VisualTreeHelper::GetChild(responseText, 0));
    for (int i = 0; i < VisualTreeHelper::GetChildrenCount(grid); ++i)
    {
        Object^ child = VisualTreeHelper::GetChild(grid, i);
        ScrollViewer^ scrollViewer = dynamic_cast<ScrollViewer^>(child);
        if (scrollViewer == nullptr) continue;

        double const horizontalOffset = 0;
        double const verticalOffset = scrollViewer->ExtentHeight;
        float const zoomFactor = 1;

        scrollViewer->ChangeView(horizontalOffset, verticalOffset, zoomFactor);
        break;
    }
}

当responseText是TextBox^ responseText时,你想要滚动的TextBox(可能与发送者相同)。


很棒的答案,不能将responseText替换为(TextBox^)responseText(TextBox^)sender进行编辑。 - rboy

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