2016-08-28 12 views
1

大きな.rtfファイルを読み込んで、その中の特定の段落までスクロールします。WPF Flowドキュメントの段落.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読み込まれたドキュメント内 段落を返す、目的の段落を見つけるためfucntionです。

...何も起こりません。任意のヒント?

私はFlowDocumentReaderを使用して私のFlowdocumentを表示します。 BringIntoViewは、ScrollModeとPageModeの両方で動作していません。

論理ツリーを介してFlowDocumentReaderのスクロールビューアに直接アクセスして操作することはできません。私は単にスクロールする場所を知らず、可能ならば「ハック」を使わない方が好きです。

答えて

2

[OK]をクリックして問題が見つかりました。

問題は、新しいFlowDocumentを読み込んだときに段落が非同期に読み込まれるため、document-paragraphを読み込んだ直後にparagraph.BringIntoView()を呼び出しても何も起こりません。ここで

はいくつかの詳細です:あなたはparagraph.IsLoadedプロパティをチェックする必要が https://support.microsoft.com/en-us/kb/959084

、それはまだロードされていない場合は、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(); 
    } 
関連する問題