[英]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.