WPF Flowdocument段落.BringIntoView()不适用于新文档

时间:2016-08-28 16:13:16

标签: wpf flowdocument

我想加载大的.rtf文件并滚动到其中的特定段落。

所以我这样做:

    private void ScrollToBookmark(string bookmark)
    {
        Paragraph p = LookUp(bookmark);
        if (p != null) p.BringIntoView();
    }

然后,我查找带书签的段落并想要滚动到那里。像这样:

class="yourStylingClass"

LookUp是一个找到所需段落的功能,它运行良好,并返回 先前加载的文件中的段落。

并且......没有任何反应。有什么提示吗?

我使用FlowDocumentReader来显示我的Flowdocument。 BringIntoView在ScrollMode和PageMode中都不起作用。

通过逻辑树直接访问FlowDocumentReader的scrollviewer并使用它进行操作不是一种选择。我根本不知道在哪里滚动,更喜欢不使用任何" hacks"如果可能的话。

1 个答案:

答案 0 :(得分:3)

好的,我发现了一个问题。

问题是,当你加载新的FlowDocument时,段落是异步加载的,所以如果你在加载文档后立即调用paragraph.BringIntoView() - 段落还不存在,那么没有任何反应。

以下是一些细节:https://support.microsoft.com/en-us/kb/959084

你需要检查paragraph.IsLoaded属性,如果它还没有加载,你需要捕获Loaded事件并在那里调用BringIntoView()。

以下是我使用的代码,它完美无缺:

    private void BringToViewParagraph(Paragraph paragraph)
    {
        if (paragraph.IsLoaded) paragraph.BringIntoView();
        else
        {
            paragraph.Loaded += paragraphLoaded;
        }
    }

    void paragraphLoaded(object sender, RoutedEventArgs e)
    {
        Paragraph paragraph = (Paragraph)sender;
        paragraph.Loaded -= paragraphLoaded;
        paragraph.BringIntoView();
    }