在便利贴中滚动

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.