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

标签 c# wpf flowdocument

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

如果这不可能,请提出任何替代解决方案。

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

最佳答案

您是否只是想自动导航到该页面?如果是这样,我们不需要知道页码并且应该能够只使用 BringIntoView?我假设您有对该 block 的引用?

以下代码导航到按下按钮时第 301 个 block 所在的页面

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”方法

关于c# - 使用 FlowDocumentPageViewer 时确定内联元素的页码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965850/

相关文章:

c# - 我应该使用什么组件来显示启用/禁用状态?

c# - 如何在 c#/winforms 中将图像裁剪成圆形?

c# - UWP 应用程序中的 HttpClient 缓存

C# WPF 在具有 AllowTransparency ="true"的窗口上显示 WebBrowser 不显示

WPF Flowdocument - 防止在 % 符号前换行

c# - VS2013 代码分析自定义字典不工作

c# - 如何在 WPF 中强制显示工具提示

c# - 基于 CheckBoxes 过滤 ObservableCollection

.net - 如何创建 Inline 类的子类? (FlowDocument 中使用的那个)

wpf - 使用 XPS 查看器打开保存为 XPS 文档的 FlowDocument?