2016-08-28 91 views
1

我想加載大.rtf文件並滾動到其中的特定段落。WPF Flowdocument paragraph.BringIntoView()不適用於新文檔

所以我做這樣的事情:

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(); 
    } 

查找,找到所需的段落溫控功能,它運作良好,並返回previosly加載文檔 段落。

而......沒有任何反應。有小費嗎?

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

通過邏輯樹直接訪問FlowDocumentReader的scrollviewer並使用它進行操作不是一個選項。我只是不知道在哪裏滾動,如果可能的話,不喜歡使用任何「黑客」。

回答

2

好吧,我發現了一個問題。

問題是,當您加載新的FlowDocument時,段落異步加載,所以如果您在加載文檔後立即調用paragraph.BringIntoView() - 段落不存在,那麼什麼都不會發生。

下面是一些細節:https://support.microsoft.com/en-us/kb/959084

你需要檢查paragraph.IsLoaded財產,如果沒有加載它,你需要捕捉加載事件,並調用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(); 
    }