在即时贴中滚动

时间:2018-10-15 13:18:24

标签: wpf scroll pdfnet

我得到了以下便签示例:

enter image description here

如果便笺有9行以上,则其他行将不可见。 我可以使用箭头键浏览便笺。如果要使用鼠标滚轮滚动,似乎会忽略弹出窗口,而只是更改页面。

是否可以为粘滞便笺弹出窗口激活滚动?

1 个答案:

答案 0 :(得分:2)

  

编辑:下面概述的解决方案将很快作为PDFTron SDK下载中包含的示例的一部分提供。同时,我希望下面的解决方案有帮助。

是的,可以激活便签的滚动。

使用单页视图时,问题最明显。在连续模式下,它似乎可以正常工作。

但是,它并不像设置VerticalScrollVisibility = ScrollBarVisibility.Auto;那样简单。有一些文件需要修改才能起作用。

好消息是,我们可以通过修改提供的示例中的代码来获得预期的行为。

解决方案

解决方案是为来自PreviewMouseWheel类的PDFViewWPF事件添加一些处理。
在下载的示例中,进行了以下更改以使事情按预期运行:

  • 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;
        }
    }
    
  • 在实例化mTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;对象(〜第183行)之后,还请确保在NoteHost.CreateNoteAndArrow()方法中添加mTextBox
  • 接下来,编辑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的机会,然后再对其进行其他操作。

要注意的另一点是,我们现在必须使用mTextBox.ScrollToVerticalOffset类中的NoteHost方法在代码中“进行滚动”