我想制作一个Touch-Viewer,我想放大手指之间的点。
我在网格中有一个带有content-presenter的视图框:
<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 。
那么如何在触摸模式中获得相对位置?
当我从 ManipulationDeltaEventArgs 获取 e.ManipulationOrigin 并且网格更大时,Viewbox会在放大或缩小时将视图框的内容转换为其他位置。< / p>
大多数示例显示缩放到内容(图像)的中间。那不是我想要的。
答案 0 :(得分:1)
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)
的源代码中找到了这个提示