【发布时间】:2018-10-15 13:18:24
【问题描述】:
【问题讨论】:
-
您是使用 PDFViewCtrl 还是 PDFViewWPF 类进行查看?
-
我正在使用 PDFViewWPF。
-
感谢您的澄清,我们正在调查此事,并会尽快更新您。
【问题讨论】:
编辑:下面概述的解决方案将很快作为 PDFTron SDK 下载中包含的示例的一部分提供。同时,我希望以下解决方案有所帮助。
是的,可以为便签激活滚动功能。
使用单页视图时问题最为明显。它似乎在连续模式下按预期工作。
然而它并不像设置VerticalScrollVisibility = ScrollBarVisibility.Auto;那么简单。需要修改一些文件才能使其正常工作。
好消息是我们可以通过修改提供的示例中的代码来获得预期的行为。
解决方案是为来自PDFViewWPF 类的PreviewMouseWheel 事件添加一些处理。
在下载的示例中,进行了以下更改以使事情按预期运行:
在NoteHost 类(Samples/PDFViewWPFTools/CS/Utilities/NoteHost.cs)中添加处理 PreviewMouseWheel 事件的方法
internal void HandlePreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
var originalSource = (UIElement)e.OriginalSource;
if (originalSource.IsDescendantOf(mNoteBorder) && mTextBox.IsFocused)
{
mTextBox.ScrollToVerticalOffset(mTextBox.VerticalOffset - e.Delta);
e.Handled = true;
}
}
NoteHost.CreateNoteAndArrow() 方法中添加 mTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;,在实例化 mTextBox 对象之后(~第 183 行)。接下来,编辑 NoteManager 类 - Samples/PDFViewWPFTools/CS/Utilities/NoteManager.cs - 并添加一个 HandlePreviewMouseWheel 方法。这将在每个显示(打开)的笔记上内部调用HandlePreviewMouseWheel,并在第一个处理事件的地方中断。
internal void HandlePreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
foreach(var note in mActiveNotes)
{
note.Value.HandlePreviewMouseWheel(sender, e);
if(e.Handled)
{
break;
}
}
}
接下来,编辑ToolManager 类以确保笔记管理器在尝试页面更改之前有机会处理PreviewMouseWheel。打开 Samples/PDFViewWPFTools/CS/ToolManager.cs 并导航到 PDFView_PreviewMouseWheel。现有方法应如下所示:
private void PDFView_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
if (mCurrentTool != null && _IsEnabled)
{
ToolManager.ToolType prev_tm = mCurrentTool.ToolMode;
ToolManager.ToolType next_tm;
while (true)
{
mCurrentTool.PreviewMouseWheelHandler(sender, e);
next_tm = mCurrentTool.NextToolMode;
if (prev_tm != next_tm)
{
mCurrentTool = CreateTool(next_tm, mCurrentTool);
prev_tm = next_tm;
}
else
{
break;
}
}
}
}
用下面的代码替换它:
private void PDFView_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
if (mCurrentTool != null && _IsEnabled)
{
ToolManager.ToolType prev_tm = mCurrentTool.ToolMode;
ToolManager.ToolType next_tm;
while (true)
{
mNoteManager.HandlePreviewMouseWheel(sender, e);
if (!e.Handled)
{
mCurrentTool.PreviewMouseWheelHandler(sender, e);
next_tm = mCurrentTool.NextToolMode;
if (prev_tm != next_tm)
{
mCurrentTool = CreateTool(next_tm, mCurrentTool);
prev_tm = next_tm;
}
else
{
break;
}
}
else
{
break;
}
}
}
}
通过执行上述操作,我们让NoteManager 有机会在对其进行任何其他操作之前处理PreviewMouseWheel。
需要注意的另一点是,我们现在必须在代码中“进行滚动”,使用NoteHost 类中的mTextBox.ScrollToVerticalOffset 方法。
【讨论】: