在ZoomableCanvas中使用Viewbox时缩放点?

时间:2014-02-12 23:59:19

标签: c# wpf zoom

感谢Kael Rowan,您可以在WPF轻松创建可缩放的画布。 示例项目可以在this blog entry的底部下载。

现在,我需要修改此示例项目以使用其Viewbox功能。在MainWindow.xaml中设置ViewboxStretchApplyTransform属性,如下所示:

<ZoomableCanvas ... Viewbox="0 0 400 400" Stretch="Fill" ApplyTransform="True" />

问题

启用此功能后,使用鼠标滚轮进行缩放不会缩放鼠标位置。相反,它似乎缩放(0,0)。这段代码(在鼠标滚轮处理程序中) Viewbox

// Adjust the offset to make the point under the mouse stay still.
var position = (Vector)e.GetPosition(MyListBox);
MyCanvas.Offset = (Point)((Vector)(MyCanvas.Offset + position) * x - position);

如何使用 Viewbox 使其正常工作?这让我疯了!数学/ WPF大师在那里,请帮助!

1 个答案:

答案 0 :(得分:1)

试试此代码

protected override void OnMouseWheel(MouseWheelEventArgs e)
{ 
    var position = e.GetPosition(this.MyCanvas);

    var pre = this.MyCanvas.TransformToAncestor(this).Transform(position);

    var x = Math.Pow(2, e.Delta / 3.0 / Mouse.MouseWheelDeltaForOneLine);
    MyCanvas.Scale *= x;

    var cur = this.MyCanvas.TransformToAncestor(this).Transform(position);

    var offset = (cur - pre);

    this.MyCanvas.Offset += offset;
}