1

スクロールビューアには、1000 インラインのテキストブロックがあります。

XAML

<Grid>
    <ScrollViewer>
        <TextBlock Name="textBlock1" TextWrapping="Wrap" />
    </ScrollViewer>        
</Grid>

C#

public MainWindow()
    {
        InitializeComponent();

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

特定のインライン要素 (850 番など) が表示されているかどうかを確認し、表示されていない場合は、表示されるように scrollviewer をスクロールする方法を教えてください。

私はC#とwpfにかなり慣れていません。

ご協力いただきありがとうございます。

4

1 に答える 1

0

Run オブジェクトはビジュアルではないため、一部のオブジェクトで使用できるように ScrollIntoView を使用することはできません。目的の Run の上部オフセットを見つけて、スクロールビューアにそのオフセットまでスクロールするように指示することで、これを達成できました。

    <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 を見つけるのはハードコーディングされています...

        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);
    }
于 2012-12-04T14:20:23.820 に答える