c# - 将新行添加到 XAML 中的 TextBlock 时,在 WPF 中将 ScrollViewer 滚动到底部
问题描述
我试图将垂直滚动条保持在底部(最新条目),但此刻,滚动条只是停留在同一个地方,所以当内容被添加到字符串中时,滚动条移动到最佳。
我知道我可以使用ServerScroll.ScrollToEnd()
我的代码隐藏中的属性将栏移到最后。但是有没有办法自动做到这一点是xaml?(这样我就不必每次添加到字符串时都调用此属性)。
XAML
<ScrollViewer Name="ServerScroll"
VerticalScrollBarVisibility="Auto">
<TextBlock Name="serverConsole"
Margin="5"
Background="White"
TextWrapping="Wrap"/>
</ScrollViewer>
代码隐藏
private void example_Click(object sender, RoutedEventArgs e)
{
ServerConsole += "asdf\r\n"; // binded to TextBlock
ServerScroll.ScrollToEnd();
}
解决方案
使用文本框,对TextBox.TextChanged
如果您想在每次更改Text
您的属性时滚动到末尾TextBlock
,我建议您切换到 aTextBox
以便您可以TextChanged
使用以下方法连接到它的事件System.Windows.Interactivity
:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Width="50" Height="25" Click="Button_Click"></Button>
<ScrollViewer Grid.Row="1" Name="ServerScroll"
VerticalScrollBarVisibility="Auto">
<TextBox Name="serverConsole"
Margin="5"
Background="White"
TextWrapping="Wrap">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<ei:CallMethodAction MethodName="ScrollToEnd" TargetObject="{Binding ElementName=ServerScroll}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
</ScrollViewer>
</Grid>
</Window>
使用 TextBlock,对Button.Click
如果您希望在Button
单击时滚动到末尾,则可以使用相同的技术来连接其Click
事件:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Width="50" Height="25" Click="Button_Click">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="ScrollToEnd" TargetObject="{Binding ElementName=ServerScroll}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<ScrollViewer Grid.Row="1" Name="ServerScroll"
VerticalScrollBarVisibility="Auto">
<TextBlock Name="serverConsole"
Margin="5"
Background="White"
TextWrapping="Wrap">
</TextBlock>
</ScrollViewer>
</Grid>
</Window>
使用 ListView,对CollectionChanged
看起来您真的想使用 anItemsControl
而不是TextBlock
athough,因为您正在谈论条目和所有内容。您也可以切换到 aListView
并连接到它的CollectionChanged
事件:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Width="50" Height="25" Click="Button_Click"/>
<ScrollViewer Grid.Row="1" Name="ServerScroll"
VerticalScrollBarVisibility="Auto">
<ListView x:Name="listView" ItemsSource="{Binding MyList}">
<i:Interaction.Triggers>
<i:EventTrigger SourceObject="{Binding MyList}" EventName="CollectionChanged">
<ei:CallMethodAction MethodName="ScrollToEnd" TargetObject="{Binding ElementName=ServerScroll}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListView>
</ScrollViewer>
</Grid>
</Window>
在您的视图模型中:
public ObservableCollection<string> MyList { get; } = new ObservableCollection<string>();
推荐阅读
- awk - 使用 awk 删除文本文件中的重复项
- python - 如何计算页面中存在的图形数量以及如何使用 python selenium 获取每个图形的工具提示?
- reactjs - 如何成功地将一个组件的状态从另一个更改?
- powerbi - 如何在 Power Bi 中构建高效的数据模型?
- ruby-on-rails - 可以采用一系列规则的 Ruby 类
- javascript - Cypress - 控制要运行的测试 - 使用 Cypress 进行播种
- json - 仅展平scala spark数据框中的最深层次
- python - *args 和 **kwargs 的默认参数
- jenkins - 无法使用 cron 运行同一 Jenkins 作业的多个实例
- jquery - 媒体屏幕语法在我的 CSS 中不起作用