在便利贴中滚动
Scrolling in Sticky Notes
我得到了以下便签示例:
如果便签超过 9 行,则其他行不可见。
我可以使用箭头键浏览笔记。如果我要用鼠标滚轮滚动,它似乎会忽略弹出窗口而只是更改页面。
是否可以激活便签弹出窗口的滚动?
Edit:The solution outlined below will soon be available as part of the samples included in the PDFTron SDK download. In the meanwhile, I hope that the below solution helps.
是的,可以为便签激活滚动。
使用单页视图时问题最为明显。它似乎在连续模式下按预期工作。
然而它并不像设置VerticalScrollVisibility = ScrollBarVisibility.Auto;
那么简单。需要修改一些文件才能使其正常工作。
好消息是我们可以通过修改提供的示例中的代码来获得预期的行为。
解决方案
解决方案是为来自 PDFViewWPF
class.
的 PreviewMouseWheel
事件添加一些处理
在下载的示例中,进行了以下更改以获得预期的 运行:
在 NoteHost
class (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
class - 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
class 以确保笔记管理器在尝试更改页面之前有机会处理 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
执行任何其他操作之前处理它。
还有一点需要注意的是,我们现在要在代码中"do the scrolling",使用NoteHost
中的mTextBox.ScrollToVerticalOffset
方法class.
我得到了以下便签示例:
如果便签超过 9 行,则其他行不可见。 我可以使用箭头键浏览笔记。如果我要用鼠标滚轮滚动,它似乎会忽略弹出窗口而只是更改页面。
是否可以激活便签弹出窗口的滚动?
Edit:The solution outlined below will soon be available as part of the samples included in the PDFTron SDK download. In the meanwhile, I hope that the below solution helps.
是的,可以为便签激活滚动。
使用单页视图时问题最为明显。它似乎在连续模式下按预期工作。
然而它并不像设置VerticalScrollVisibility = ScrollBarVisibility.Auto;
那么简单。需要修改一些文件才能使其正常工作。
好消息是我们可以通过修改提供的示例中的代码来获得预期的行为。
解决方案
解决方案是为来自 PDFViewWPF
class.
的 PreviewMouseWheel
事件添加一些处理
在下载的示例中,进行了以下更改以获得预期的 运行:
在
中添加处理 PreviewMouseWheel 事件的方法NoteHost
class (Samples/PDFViewWPFTools/CS/Utilities/NoteHost.cs)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
class - 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
class 以确保笔记管理器在尝试更改页面之前有机会处理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
执行任何其他操作之前处理它。
还有一点需要注意的是,我们现在要在代码中"do the scrolling",使用NoteHost
中的mTextBox.ScrollToVerticalOffset
方法class.