更改放大/缩小中心点

时间:2011-09-14 08:11:03

标签: c# .net wpf zoom transformation

我正在编写一个显示XAML对象的WPF应用程序(它基本上是在XAML中绘制的地图)。作为其功能的一部分,它应该放大/缩小和平移。平移工作正常,缩放变焦,但我不太明白如何缩放到特定点,例如我的鼠标光标。

这是我目前的代码:

internal void PerformZoom(float ZoomFactor, Point ZoomCenterPoint)
{
  m_originalTransform = m_canvas.RenderTransform;
  float newZoomFactor = m_oldZoomFactor + ZoomFactor;

  float scaleToApply = (newZoomFactor / m_oldZoomFactor);
  m_totalZoom = newZoomFactor;

  var st = new ScaleTransform(scaleToApply, scaleToApply);

  TransformGroup tg = new TransformGroup();
  tg.Children.Add(m_originalTransform);
  tg.Children.Add(st);
  m_canvas.RenderTransform = tg;

  m_oldZoomFactor = newZoomFactor;
}

[edit] 找到解决方案 - 刚刚编辑了转换的CenterX / CenterY属性,它就像一个魅力。 谢谢你的帮助!

[edit2] 这是一个可行的解决方案(考虑鼠标位置):

public partial class MainWindow
{
    private float currentZoom = 1f;
    private const float StepSize = .2f;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void MainGrid_OnMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var pos = 1;
        if (e.Delta < 0)
        {
            pos = -1;
        }

        var mousePosition = e.MouseDevice.GetPosition(MainGrid);

        currentZoom += StepSize * pos;
        var transform = new ScaleTransform(currentZoom, currentZoom, mousePosition.X, mousePosition.Y);
        MainGrid.RenderTransform = transform;
    }
}

1 个答案:

答案 0 :(得分:2)

您必须使用TranslateTransform组合ScaleTransform,以便在缩放时平移组件。

TranslateTransform给出的偏移量取决于您想要的行为(即鼠标中心,屏幕中心......)

我在过去写过一个你可以附加到组件的行为:它使它可以缩放(以鼠标为中心,对鼠标滚轮作出反应) 它非常脏,不确定是否有效(我不再使用它)...评论用法语: - /

see the source

[edit] 事实上,我记得是滚动和缩放Panels背景。但是,将其应用于任何对象并不是很难修改,因为图像和元素的转换是相同的。