【问题标题】:WPF Flowdocument paragraph.BringIntoView() is not working for new documentsWPF Flowdocument 段落.BringIntoView() 不适用于新文档
【发布时间】:2016-09-03 18:32:56
【问题描述】:

我想加载大的 .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。 BringIntoView 在 ScrollMode 和 PageMode 中都不起作用。

通过逻辑树直接访问 FlowDocumentReader 的滚动查看器并使用它进行操作不是一种选择。我根本不知道在哪里滚动,如果可能的话,我宁愿不使用任何“黑客”。

【问题讨论】:

    标签: wpf flowdocument


    【解决方案1】:

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

    问题是,当您加载新的 FlowDocument 时,段落会异步加载,因此如果您在加载文档后立即调用段落.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();
        }
    

    【讨论】:

    • 它也对我有用,就是这样。谢谢奥列格。
    猜你喜欢
    • 2010-09-27
    • 2011-12-02
    • 2018-04-27
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2023-04-09
    相关资源
    最近更新 更多