UWP Canvas 在 Scrollviewer 中像鼠标输入一样处理笔输入

UWP Canvas inside Scrollviewer handle pen input like mouse input

我在 Scrollviewer 中有一个 Canvas(不是 InkCanvas)。两者都不是在 XAML 中创建的,而是在后面的代码中创建的。我想用笔和鼠标输入在 Canvas 上画线,一切正常,但现在我用笔作为输入设备测试了整个东西,Scrollviewer 似乎将其识别为触摸输入,因为整个事情开始了滚动。

我的问题是:是否可以告诉 Scrollviewer 忽略来自设备类型的所有输入?因为看起来 Scrollviewer 也是 'eating' 应该从 Canvas.

触发的事件

这是我的 Scrollviewer 初始化:

private void SetUpScrollViewer()
    {
        scroll = new ScrollViewer();

        scroll.VerticalScrollMode = ScrollMode.Auto;
        scroll.HorizontalScrollMode = ScrollMode.Auto;
        scroll.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
        scroll.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
        scroll.ZoomMode = ZoomMode.Enabled;
        scroll.ManipulationMode = ManipulationModes.System;
        scroll.HorizontalAlignment = HorizontalAlignment.Left;
        scroll.VerticalAlignment = VerticalAlignment.Top;
        scroll.IsZoomInertiaEnabled = false;

        scroll.MinZoomFactor = 1;
        scroll.MaxZoomFactor = 5;
    }

这些是我在 Canvas:

中使用的事件
public void EnableDrawingOnCanvas(Canvas canvas)
    {
        //Adding the needed event handler.
        canvas.PointerPressed += Canvas_PointerPressed;
        canvas.PointerMoved += Canvas_PointerMoved;
        canvas.PointerReleased += Canvas_PointerReleased;
        canvas.PointerExited += Canvas_PointerExited;
    }

并且这些事件都检查输入设备是否像这样触摸

if (e.Pointer.PointerDeviceType != Windows.Devices.Input.PointerDeviceType.Touch){...}

但是对于这些事件,我只能检查我的 Canvas 的输入设备,如果我将事件添加到 Scrollviewer,它不会传递给 Canvas afaik。

您可以将 PointerPressed 事件绑定到您的 ScrollViewer 并检查 e.Pointer.PointerDeviceType 是否等于 PointerDeviceType.Pen。然后你可以像下面的代码一样禁用VerticalScrollModeHorizontalScrollModeZoomMode

如果您想重新激活 ScrollViewer,您可以将 PointerExited 事件绑定到您的 ScrollViewer 并重新启用所有内容。

private void Scroll_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType == PointerDeviceType.Pen)
    {
        scroll.VerticalScrollMode = ScrollMode.Disabled;
        scroll.HorizontalScrollMode = ScrollMode.Disabled;
        scroll.ZoomMode = ZoomMode.Disabled;
    }
}