【问题标题】:Centering mouse-scroll zoom onto the current mouse position将鼠标滚动缩放居中到当前鼠标位置
【发布时间】:2017-12-24 01:13:51
【问题描述】:

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

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>

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    通过结合我的问题中的 2 个 sn-ps,我想出了这个

    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;
    }
    

    它几乎完成了我需要它做的事情,即在当前鼠标位置居中图像。

    【讨论】:

      猜你喜欢
      • 2016-09-12
      • 2014-04-16
      • 2020-05-28
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2015-04-20
      • 1970-01-01
      相关资源
      最近更新 更多