c# - Scrollviewer 中的 UWP Canvas 像鼠标输入一样处理笔输入

标签 c# .net canvas uwp scrollviewer

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

我的问题是:是否可以告诉 Scrollviewer 忽略来自设备类型的所有输入?因为看起来 Scrollviewer 正在“吃掉”应该从 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 的输入设备,如果我将事件添加到滚动查看器,它不会传递给 Canvas afaik。

最佳答案

您可以将 PointerPressed 事件绑定(bind)到您的 ScrollViewer 并检查 e.Pointer.PointerDeviceType 是否等于 PointerDeviceType.Pen。然后,您可以禁用 VerticalScrollModeHorizo​​ntalScrollModeZoomMode,如下面的代码所示。

如果您想重新激活 ScrollViewer,您可以将 PointerExited 事件绑定(bind)到您的 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;
    }
}

关于c# - Scrollviewer 中的 UWP Canvas 像鼠标输入一样处理笔输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123914/

相关文章:

c# - 在 asp.net mvc 4 应用程序中的身份验证中使用 session 变量

c# - 如何通过 C# TestFrameworks 使用 DI 框架中的 AOP? (不适用于被测项目)

.net - Appveyor - .NET MVC 和 NodeJS 构建

javascript - HTML 5 Canvas : Uploaded image colour picker

java - 在iText7中创建PdfTextFormField专门用于数字输入

c# - 将 double 转换为没有 Infinity 的 float

c# - 处理 400 万条记录时内存不足

c# - 以 WebBrowser 窗体(Windows 窗体 C#)完全加载页面时的 DocumentCompleted 事件

javascript - HTML5 Canvas 和滚动

javascript - 如何获取鼠标单击 Canvas 元素的坐标?