我的应用程序中有一个 FlowDocumentPageViewer 控件,它以编程方式在 FlowDocument 中的每个块和内联元素中前进(这是因为它是打字应用程序的一部分,这样做会提供视觉提示,告诉用户输入什么内容)。每次更改我关注的内联元素时,我都想检查内联元素在哪个页面上,如果它不在当前页面上,则导航到它所在的页面。
如果这是不可能的,请提出任何替代解决方案。
此外,如果重要的话,我正在处理的每个内联元素都是一个 Run 元素。
我的应用程序中有一个 FlowDocumentPageViewer 控件,它以编程方式在 FlowDocument 中的每个块和内联元素中前进(这是因为它是打字应用程序的一部分,这样做会提供视觉提示,告诉用户输入什么内容)。每次更改我关注的内联元素时,我都想检查内联元素在哪个页面上,如果它不在当前页面上,则导航到它所在的页面。
如果这是不可能的,请提出任何替代解决方案。
此外,如果重要的话,我正在处理的每个内联元素都是一个 Run 元素。
你只是想自动导航到页面吗?如果是这样,我们不需要知道页码并且应该能够只使用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);
请注意,它是 0 索引,而不是从 1 开始的“lol”方法