将鼠标滚动缩放到当前鼠标位置

时间:2017-12-24 01:13:52

标签: c# wpf xaml

我可以使用以下代码放大我的图像:

var transformGroup = (TransformGroup)image.RenderTransform;
var transform = (ScaleTransform)transformGroup.Children[0];

double zoom = e.Delta > 0 ? ZoomSpeed : -ZoomSpeed;

if (!(transform.ScaleX < minScale) || zoom > 0)
{
    transform.ScaleX += zoom;
    transform.ScaleY += zoom;
}

它工作正常,但我希望图像在我滚动鼠标时放大。

我尝试复制this answer

var matTrans = image.RenderTransform as MatrixTransform;
var pos1 = e.GetPosition(image);

var scale = e.Delta > 0 ? ZoomSpeed : -ZoomSpeed;

var mat = matTrans.Matrix;
mat.ScaleAt(scale, scale, pos1.X, pos1.Y);
matTrans.Matrix = mat;
e.Handled = true;

但由于某种原因,我在第一行得到NullReferenceException,即使我可以看到image肯定包含我的xaml窗口中的对象。

我真的很感激和帮助这个 - 我几乎没有进行这种转变的经验。

这是我的xaml:

<Grid>
    <Border Name="border" Margin="10,26,10.4,27.8">
        <Image Name="image" Source="{Binding DisplayedImage, Mode=OneWay, IsAsync=True}" Opacity="1" Margin="0,0,-0.4,0.2" />
    </Border>
</Grid>

1 个答案:

答案 0 :(得分:0)

通过在我的问题中结合两个片段,我想出了这个

var transformGroup = (TransformGroup)image.RenderTransform;
var transform = (ScaleTransform)transformGroup.Children[0];
var pos1 = e.GetPosition(image);
double zoom = e.Delta > 0 ? ZoomSpeed : -ZoomSpeed;

if (!(transform.ScaleX < minScale) || zoom > 0) 
{
    transform.ScaleX += zoom;
    transform.ScaleY += zoom;

    transform.CenterX = pos1.X;
    transform.CenterY = pos1.Y;
}

它完全符合我的需要,它将图像置于当前鼠标位置的中心位置。