pdfnet:单页旋转后不刷新
pdfnet: No refresh after single page rotation
我设法旋转了文档中的各个页面,但我无法通过任何方式刷新页面以使其正常工作。我必须重新导航到页面才能看到旋转的效果。对我们的用户来说不是理想的场景。
MyPDF查看代码:
public void RotatePage(int page)
{
Page.Rotate originalRotation = m_PdfDocument.GetPage(page).GetRotation();
Page.Rotate rotation;
switch (originalRotation)
{
case Page.Rotate.e_0: rotation = Page.Rotate.e_90; break;
case Page.Rotate.e_90: rotation = Page.Rotate.e_180; break;
case Page.Rotate.e_180: rotation = Page.Rotate.e_270; break;
case Page.Rotate.e_270: rotation = Page.Rotate.e_0; break;
default: rotation = Page.Rotate.e_0; break;
}
m_PdfDocument.GetPage(page).SetRotation(rotation);
}
frm主要代码:
private void btnTurnView_ItemClick(object sender, ItemClickEventArgs e)
{
if (CurrentForm != null)
{
CurrentForm.p_m_oPDFViewCtrl.RotatePage(CurrentForm.p_m_oPDFViewCtrl.p_PageInfo.p_PageNumber);
}
}
到目前为止我已经尝试过的事情:document/view 不同部分的 Invalidate()、Refresh()、Update()。我可以 运行 页面分析(类似于页面更改时发生的情况),这可能会解决问题,但会带来不必要的开销,如果有更有效的方法,我宁愿依赖它。
已经找到了,有一个方法UpdatePageLayout()
可以做到这一点。
原代码实际上有两个错误。
第一个是缺少的 UpdatePageLayout。
第二个缺少 concurrency locking,因为您正在一个线程上修改文档,而后台线程正在读取文档。最后,在最新版本中,现在有调整旋转的辅助功能,因此可以避免整个开关块。
因此,永久旋转单个页面并同时在 PDFViewCtrl 中查看它的更安全的方法如下。
public void RotatePage(int page_number)
{
mPDFView.DocLock(true); // lock the document for editing, and stop rendering
try
{
Page page = mPDFView.GetDocument().GetPage(page_number);
page.SetRotation(Page.AddRotations(Page.Rotate.e_90, page.GetRotation()));
}
finally
{
mPDFView.DocUnlock(); resume background threads
}
mPDFView.UpdatePageLayout();
}
注意,文档锁定。由于您正在直接访问文档,因此需要锁定它(读锁或写锁)以便后台线程暂停。对 PDFViewCtrl 本身的任何调用都已处理此问题。这个 document 有更多的细节。
我设法旋转了文档中的各个页面,但我无法通过任何方式刷新页面以使其正常工作。我必须重新导航到页面才能看到旋转的效果。对我们的用户来说不是理想的场景。
MyPDF查看代码:
public void RotatePage(int page)
{
Page.Rotate originalRotation = m_PdfDocument.GetPage(page).GetRotation();
Page.Rotate rotation;
switch (originalRotation)
{
case Page.Rotate.e_0: rotation = Page.Rotate.e_90; break;
case Page.Rotate.e_90: rotation = Page.Rotate.e_180; break;
case Page.Rotate.e_180: rotation = Page.Rotate.e_270; break;
case Page.Rotate.e_270: rotation = Page.Rotate.e_0; break;
default: rotation = Page.Rotate.e_0; break;
}
m_PdfDocument.GetPage(page).SetRotation(rotation);
}
frm主要代码:
private void btnTurnView_ItemClick(object sender, ItemClickEventArgs e)
{
if (CurrentForm != null)
{
CurrentForm.p_m_oPDFViewCtrl.RotatePage(CurrentForm.p_m_oPDFViewCtrl.p_PageInfo.p_PageNumber);
}
}
到目前为止我已经尝试过的事情:document/view 不同部分的 Invalidate()、Refresh()、Update()。我可以 运行 页面分析(类似于页面更改时发生的情况),这可能会解决问题,但会带来不必要的开销,如果有更有效的方法,我宁愿依赖它。
已经找到了,有一个方法UpdatePageLayout()
可以做到这一点。
原代码实际上有两个错误。
第一个是缺少的 UpdatePageLayout。
第二个缺少 concurrency locking,因为您正在一个线程上修改文档,而后台线程正在读取文档。最后,在最新版本中,现在有调整旋转的辅助功能,因此可以避免整个开关块。
因此,永久旋转单个页面并同时在 PDFViewCtrl 中查看它的更安全的方法如下。
public void RotatePage(int page_number)
{
mPDFView.DocLock(true); // lock the document for editing, and stop rendering
try
{
Page page = mPDFView.GetDocument().GetPage(page_number);
page.SetRotation(Page.AddRotations(Page.Rotate.e_90, page.GetRotation()));
}
finally
{
mPDFView.DocUnlock(); resume background threads
}
mPDFView.UpdatePageLayout();
}
注意,文档锁定。由于您正在直接访问文档,因此需要锁定它(读锁或写锁)以便后台线程暂停。对 PDFViewCtrl 本身的任何调用都已处理此问题。这个 document 有更多的细节。