簡體   English   中英

C#通用應用程序:以編程方式設置新文本后自動滾動到文本框的底部

[英]C# universal app: automatically scroll to bottom of textbox after setting new text programmatically

{
   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);
        });

TextBox默認具有嵌入式ScrollViewer 我們可以在TextBox樣式和模板中找到它。 不需要再將TextBox放在另一個ScrollViewer

需要時,將自動啟用使用滾輪或觸摸滾動。 但是,默認情況下不顯示垂直滾動條。 您可以通過在嵌入的ScrollViewer上將ScrollViewer.VerticalScrollBarVisibility設置為Auto來顯示垂直滾動條,如此處所示。

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

有關詳細信息,請參閱TextBox類備注中的啟用多行輸入部分。

因此,要滾動到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方法

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;
    }
}

設置新文本后,嘗試在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">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM