使用FlowDocumentPageViewer时确定内联元素的页码?

时间:2012-06-10 01:53:13

标签: c# wpf flowdocument

我的应用程序中有一个FlowDocumentPageViewer控件,它以编程方式前进到FlowDocument中的每个块和内联元素(这是因为它是打字应用程序的一部分,这样做会提供视觉提示,告诉用户输入什么内容)。每当我更改我关注的内联元素时,我想检查内联元素所在的页面,如果它不在当前页面上,则导航到它所在的页面。

如果无法做到这一点,请建议任何其他解决方案。

另外,如果重要的话,我正在处理的每个内联元素都是一个Run元素。

1 个答案:

答案 0 :(得分: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);

请注意,它是0索引,而不是从1开始的“lol”方法