WPF文本框scrolloline方法首先滚动到不可见,然后滚动到可见



对于WPF TextBox UI控件,scrolloline()方法只有一个参数,它接受一个整数值。该值是您希望显示的行号,其中第0行是文本的第一行。如果文本行已经可见,则文本框不会滚动。如果不在视图范围内,内容将以显示。">

行所需的最小滚动量滚动。基本上,我不想要这种行为,我希望它总是滚动,即使它是可见的。所以我写了这段代码来测试一下。

假设我有一个XML:

<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:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Loaded="Window_Loaded"
Title="MainWindow" Height="450" Width="800">
<DockPanel LastChildFill="True">
<StackPanel Orientation="Horizontal"  DockPanel.Dock="Top" Background="Aqua">
<TextBox Name="linenum" Width="80" Text="0"/>
<Button Name="Go" Content="Go" Click="Go_Click"/>
</StackPanel>
<TextBox Name="textbox1" VerticalScrollBarVisibility="Auto"/>
</DockPanel>
</Window>

和c#:

using System.Windows;
namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
string text1 = "";
for(int i=0; i < 10000; i++)
{
text1 = text1 + i.ToString() + "n";
}
textbox1.Text = text1;
}
private void Go_Click(object sender, RoutedEventArgs e)
{
int ilinenum = int.Parse(linenum.Text);
textbox1.ScrollToLine(textbox1.LineCount-1);
textbox1.ScrollToLine(ilinenum);
}
}
}

基本上,我想滚动到第10行,首先滚动到TextBox的非可视部分,也就是。(文本框的末尾),然后在单击"Go"按钮时立即滚动回第10行。按钮。

为什么这个不行?当我输入10时,它会滚动到最后,并忽略对scrolloline的第二次调用。

我的测试如下,从位于第0行的滚轮开始。在文本框中输入10,单击go。请遵守以上行为。

尝试关注:

private void Go_Click(object sender, RoutedEventArgs e)
{
int ilinenum = int.Parse(linenum.Text);
var target_char_rect = textbox1.GetRectFromCharacterIndex(
textbox1.GetCharacterIndexFromLineIndex(ilinenum));
var first_char_rect = textbox1.GetRectFromCharacterIndex(0);
textbox1.ScrollToVerticalOffset(target_char_rect.Top-first_char_rect.Top);
}



最新更新