我在 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
。然后,您可以禁用 VerticalScrollMode
、HorizontalScrollMode
和 ZoomMode
,如下面的代码所示。
如果您想重新激活 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/