C# 如何查看scrollviewer子元素是否可见,如果它不可见,如何使其可见';T

C# 如何查看scrollviewer子元素是否可见,如果它不可见,如何使其可见';T,c#,wpf,visibility,scrollviewer,textblock,C#,Wpf,Visibility,Scrollviewer,Textblock,在scrollviewer中,我有一个包含1000条内联线的文本块 XAML C# public主窗口() { 初始化组件(); 对于(int i=0;i

在scrollviewer中,我有一个包含1000条内联线的文本块

XAML


C#

public主窗口()
{
初始化组件();
对于(int i=0;i<1000;i++)
{
textBlock1.Inlines.Add(新运行(“内联编号”+i.ToString()+”);
}
}
如何查看特定的内联元素(例如,数字850)是否可见,如果不可见,请让scrollviewer滚动以使其可见

我对C#和wpf是相当陌生的


感谢您的帮助。

由于运行对象不是视觉对象,您不能像对某些对象那样使用ScrollIntoView。我能够通过定位所需运行的顶部偏移量并指示scrollviewer滚动到该偏移量来完成它

    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>

    <Button Grid.Row="0" x:Name="findButton" Click="findButton_Click_1">Find It</Button>
    <ScrollViewer x:Name="scrollViewer1" Grid.Row="1">
        <TextBlock Name="textBlock1" TextWrapping="Wrap" />
    </ScrollViewer>
</Grid>

找到它
这是背后的代码。找到Run#850是硬编码的

运行目标;
公共主窗口()
{
初始化组件();
对于(int i=0;i<1000;i++)
{
var run=新运行(“内联编号”+i.ToString()+”);
如果(i==850)
目标=运行;
textBlock1.Inlines.Add(运行);
}
}
public void find按钮单击1(对象发送器,路由目标e)
{
var contentStart=target.contentStart;
var rect=contentStart.GetCharacterRect(LogicalDirection.Forward);
scrollViewer1.ScrollToVerticalOffset(垂直顶部);
}

我想我没有回答关于看它是否可见的部分。您可以获得我的代码中的偏移量,并根据可见范围进行测试:[滚动查看器的当前偏移量,偏移量+视口高度],以确定运行是否可见。
public MainWindow()
    {
        InitializeComponent();

        for (int i = 0; i < 1000; i++)
        {
            textBlock1.Inlines.Add(new Run("Inline number " + i.ToString() + ". "));
        }
    }
    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>

    <Button Grid.Row="0" x:Name="findButton" Click="findButton_Click_1">Find It</Button>
    <ScrollViewer x:Name="scrollViewer1" Grid.Row="1">
        <TextBlock Name="textBlock1" TextWrapping="Wrap" />
    </ScrollViewer>
</Grid>
        Run target;

    public MainWindow()
    {
        InitializeComponent();

        for (int i = 0; i < 1000; i++)
        {
            var run = new Run("Inline number " + i.ToString() + ". ");
            if (i==850)
                target = run;
            textBlock1.Inlines.Add(run);
        }
    }

    public void findButton_Click_1(object sender, RoutedEventArgs e)
    {
        var contentStart = target.ContentStart;
        var rect = contentStart.GetCharacterRect(LogicalDirection.Forward);
        scrollViewer1.ScrollToVerticalOffset(rect.Top);
    }