WPF Flowdocument 段落.BringIntoView() 在新文档中无效。

3

我希望能够加载大的 .rtf 文件,并滚动到其中特定的段落。

因此,我会执行以下操作:

    private FlowDocument GenerateDocument(string path)
    {
        var doc = new FlowDocument();
        using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
        {
            var content = new TextRange(doc.ContentStart, doc.ContentEnd);
            content.Load(fs, DataFormats.Rtf);
        }
        return doc;
    }

然后,我查找了已经加书签的段落,想要滚动到该处。类似于这样:

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

LookUp是一种查找所需段落的函数,它能够很好地工作,并返回先前加载的文档中的段落。

但是...什么都没有发生。有什么提示吗?

我使用FlowDocumentReader来显示我的Flowdocument。在ScrollMode和PageMode中,BringIntoView都无法正常工作。

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

1个回答

6

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

问题是,在加载新的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();
    }

这对我也起作用了,就是这样。谢谢 Oleg。 - Rogério Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接