双指缩放:获取相对于对象的触摸位置

Pinch-Zoom: Get Touch Position relative to Object

我想制作一个触摸查看器,我想在其中放大手指之间的点。

我有一个在网格内带有内容展示器的视图框:

<Grid IsManipulationEnabled="True">
   <Viewbox x:Name="PART_Viewbox">
      /// Content
   </Viewbox>
</Grid>

用我的鼠标滚轮放大到鼠标所在的点,我通过以下方法解决了:

var position = e.GetPosition(PART_Viewbox);
matrix.ScaleAtPrepend(scale, scale, position.X, position.Y);

方法 e.GetPosition 仅在 MouseEventsArgs 中可用,在 ManipulationDeltaEventArgs[=33= 中不可用].

那么如何获取触摸模式下的相对位置呢?

当我从 ManipulationDeltaEventArgs 中获取 e.ManipulationOrigin 并且网格比 Viewbox 大时,它会翻译放大或缩小时在其他地方查看框。

显示放大到内容(图像)中间的最多示例。那不是我想要的。

class FrameworkElement 派生自 UIElement。有一种方法 TranslatePoint 可以平移相对于元素的点。

ManipulationDeltaEventArgs 中是一个 属性 ManipulationOrigin,它表示在缩放中两根手指之间的点。另一个重要的 属性 是 ManipulationContainer,它包含执行操作的元素。

所以就我而言,我可以执行以下操作:

// Typecast ManipulationContainer to FrameworkElement and get point around the finger
Point position =((FrameworkElement)e.ManipulationContainer)
.TranslatePoint(e.ManipulationOrigin, _Viewbox);

// Center the new point in account to previous manipulations
position = matrix.Transform(position);

// do the transformation
matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, position.X, position.Y)

我在 https://multitouchtransformbehavior.codeplex.com/

的源代码中找到了这个提示