如何将垂直滚动条移动到找到单词的视口 - 流文档

本文关键字:视口 文档 单词 垂直 滚动条 移动 | 更新日期: 2023-09-27 18:37:04

我的 XAML 文件中有以下带有段落的流文档:

<FlowDocumentScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
    <FlowDocument Name="fDocument" PagePadding="10" FontFamily="Segoe UI" FontSize="22">
        <Paragraph Name="fdParagraph">
            Those who have denied the reality of moral distinctions, may be
            ranked among the disingenuous disputants; nor is it conceivable,
            that any human creature could ever seriously believe, that all
            characters and actions were alike entitled to the affection and
            regard of everyone. The difference, which nature has placed
            between one man and another, is so wide, and this difference is
            still so much farther widened, by education, example, and habit,
            that, where the opposite extremes come at once under our
            apprehension, there is no scepticism so scrupulous, and scarce
            any assurance so determined, as absolutely to deny all
            distinction between them. Let a man's insensibility be ever so
            great, he must often be touched with the images of Right and
            Wrong; and let his prejudices be ever so obstinate, he must
            observe, that others are susceptible of like impressions. The
            only way, therefore, of converting an antagonist of this kind, is
            to leave him to himself.
        </Paragraph>
    </FlowDocument>
</FlowDocumentScrollViewer>

有时,我可能有较大的文本内容,无法适应当前视口。

是否有可能以及如何将垂直滚动条移动到发现单词的视口?

如何将垂直滚动条移动到找到单词的视口 - 流文档

为了做到这一点,你需要在FlowDocument中垂直放置TextPointer,并调用ScrollViewer方法ScrollToVerticalOffset

简而言之,这是如何:

public static class FlowDocumentExtensions
    {
        public static void ScrollToWord(
            this FlowDocument flowDocument,
            ScrollViewer scrollViewer,
            string word)
        {
            var currentText = flowDocument.ContentStart;
            while (true)
            {
                TextPointer nextText = 
                       currentText.GetNextContextPosition(
                          LogicalDirection.Forward);
                if (nextText == null)
                    return;
                TextRange txt = new TextRange(currentText, nextText);
                int index = txt.Text.IndexOf(word, StringComparison.Ordinal);
                if (index > 0)
                {
                    TextPointer start = currentText.GetPositionAtOffset(index);
                    if (start != null)
                    {
                        var rect = start.GetCharacterRect(
                           LogicalDirection.Forward);
                        scrollViewer.ScrollToVerticalOffset(rect.Y);
                    }
                    return;
                }
                currentText = nextText;
            }
        }
    }

如果您想了解如何从FlowDocument获取ScrollViewer:从代码中滚动 WPF FlowDocumentScrollViewer?