当 ScrollViewer 接收到基于触摸的 PointerPressed 时,它会转向直接操作以响应地处理平移和缩放。直接操作捕获指针输入,因此 Canvas 的 PointerMoved 和 PointerReleased 事件不会触发。没有事件 -> 没有绘图。
ScrollViewer 使用鼠标平移或缩放,因此鼠标事件可以到达画布。
假设您总是希望 Canvas 处理指针事件而不是滚动(也许 Grid 中还有其他控件使用 ScrollViewer),您可以将 Canvas 的 ManipulationMone 设置为 all 以让 Canvas 块上的触摸触摸滚动查看器
<Canvas x:Name="cvWorkSpace"
Background={ThemeResource WorkSpaceBackgroundBrush}
Tapped="svWorkSpace_Tapped"
ManipulationMode="All"
PointerPressed="svWorkSpace_PointerPressed"
PointerMoved="svWorkSpace_PointerMoved"
PointerReleased="svWorkSpace_PointerReleased"/>
如果您只是有时希望 Canvas 处理指针事件,那么您可以将 ManipulationMode 切换回 System,让 ScrollViewer 处理它。如果您想通过单点触摸在画布上绘图并通过多点触摸平移/缩放,那么您可以处理画布上的操纵事件以平移和缩放。
还要确保画布不透明,并让指针事件传递到其后面的任何内容。如果你想在图像上绘图,你可以设置一个 ImageBrush,将图像作为 Canvas 的背景,而不是使用单独的 Image 控件。
10年前的一个答案现在对我有帮助。非常感谢。