C#通用应用程序:以编程方式设置新文本后自动滚动到文本框的底部

时间:2016-07-06 18:02:21

标签: c# uwp windows-10-universal

{
   var stringBuilder = new StringBuilder(OutputTextBox.Text);
   stringBuilder.Append("sample text\n");
   OutputTextBox.Text = stringBuilder.ToString();
}

如何在插入新文本后自动滚动到文本框的底部?我已经读过它已经使用了.append方法。不幸的是,这种方法在通用应用中并不存在。文本框是只读的。

.xaml看起来像这样:

<ScrollViewer Name="ScrollViewer" HorizontalAlignment="Left" Height="175" VerticalAlignment="Top" Width="337" RenderTransformOrigin="1.774,9.9" Margin="95,95,-370,-223">
            <TextBox x:Name="OutputTextBox" HorizontalAlignment="Left" Height="175" VerticalAlignment="Top" Width="337" RenderTransformOrigin="1.774,9.9" TextWrapping="Wrap" AcceptsReturn="True" IsReadOnly="True"/>
</ScrollViewer>

我试图做的是:

        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            var stringBuilder = new StringBuilder(OutputTextBox.Text);
            stringBuilder.Append("sample text\n");
            OutputTextBox.Text = stringBuilder.ToString();
            ScrollViewer.ChangeView(0.0f, double.MaxValue, 1.0f);
        });

2 个答案:

答案 0 :(得分:3)

默认情况下,

TextBox嵌入了ScrollViewer。我们可以在TextBox styles and templates找到它。无需再次将TextBox放入另一个ScrollViewer

  

在需要时自动启用使用滚轮或触摸滚动。但是,默认情况下不显示垂直滚动条。您可以通过在嵌入式ScrollViewer.VerticalScrollBarVisibility上将ScrollViewer设置为自动来显示垂直滚动条,如下所示。

<TextBox AcceptsReturn="True" TextWrapping="Wrap" 
         MaxHeight="172" Width="300" Header="Description"
         ScrollViewer.VerticalScrollBarVisibility="Auto"/>

有关详细信息,请参阅TextBox class备注中的启用多行输入部分。

因此,要滚动到TextBox的底部,我们可以首先获取嵌入的ScrollViewer,然后使用ChangeView滚动TextBox中的文本。以下是一个简单的例子:

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

但是,使用ChangeView方法时出现问题,我们在TextBox中使用此方法后无法使用滚轮滚动或触摸。作为解决方法,我们可以临时使用ScrollViewer.ScrollToVerticalOffset method

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

答案 1 :(得分:0)

设置新文本后,请尝试在ScrollViewer上更改视图:

ScrollViewer.ChangeView(0.0f, double.MaxValue, 1.0f);

或使用ScrollViewer.ScrollToEnd();

并向ScrollView添加以下设置:

VerticalScrollBarVisibility="Visible" AllowDrop="False" ManipulationMode="Control"

你喜欢这个:

<ScrollViewer Name="ScrollViewer" HorizontalAlignment="Left" Height="175" VerticalAlignment="Top" Width="337" RenderTransformOrigin="1.774,9.9" Margin="95,95,-370,-223" VerticalScrollBarVisibility="Visible" AllowDrop="False" ManipulationMode="Control">