ページに自動的に移動しようとしているだけですか? その場合、ページ番号を知る必要はなく、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であることに注意してください