1

アプリケーションに FlowDocumentPageViewer コントロールがあり、FlowDocument の各ブロックとインライン要素をプログラムで進めます (これは、入力アプリケーションの一部であり、入力する内容をユーザーに伝える視覚的な合図が得られるためです)。注目しているインライン要素を変更するたびに、インライン要素がどのページにあるかを確認し、現在のページにない場合は、そのページに移動したいと考えています。

これが不可能な場合は、代替ソリューションを提案してください。

また、問題があれば、私が扱っているすべてのインライン要素は Run 要素です。

4

1 に答える 1

4

ページに自動的に移動しようとしているだけですか? その場合、ページ番号を知る必要はなく、BringIntoView を使用するだけでよいのでしょうか? ブロックへの参照があると思いますか?

次のコードは、ボタンが押されたときに 301 番目のブロックがオンになっているページに移動します。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        FlowDocument fd = new FlowDocument();

        for (int i = 0; i < 1000; i++)
        {
            fd.Blocks.Add(new Paragraph(new Run(i.ToString())));
        }

        view.Document = fd;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        (view.Document as FlowDocument) .Blocks.Skip(300).First().BringIntoView();
    }

}

本当に、本当にページ番号が必要な場合は、次のことができます。

var previousPage = view.MasterPageNumber;

(view.Document as FlowDocument) .Blocks.Skip(300).First().BringIntoView();

var pageOfControl = view.MasterPageNumber;

view.GoToPage(previousPage);

テストアプリではちらつきも何もありませんでした笑!私の仲間はそれが気に入らなかったので、彼は提案しました:

var ddp = (DynamicDocumentPaginator)view.Document.DocumentPaginator;
var position = ddp.GetObjectPosition(document.Blocks.Skip(300).First());
var page = ddp.GetPageNumber(position);

1から始まる「lol」メソッドとは対照的に、インデックスが0であることに注意してください

于 2012-06-13T05:18:52.273 に答える