Silverlight DeepZoom拖动可以将多尺度图像拖离屏幕

Silverlight DeepZoom拖动可以将多尺度图像拖离屏幕,silverlight,deepzoom,multiscaleimage,Silverlight,Deepzoom,Multiscaleimage,我有点问题,希望有人能回答这个问题。我有一个深度缩放项目,我使用了标准的(深度缩放作曲家)项目,该项目在MultiScale图像控件上放置了一个深度缩放器行为。我试图限制拖动,以确保用户不会将图像拖离屏幕(因此无法找到图像)。我添加了一个Home按钮,它会以1的缩放比例将图像恢复到起始位置。无论如何,这是我目前拥有的代码(已经在互联网上搜寻答案) 我真的需要一个适用于右下角的解决方案,但当我放大所有值时,所有值都会发生变化。如果缩放级别为1,则我的限制代码有效。我不敢相信这在互联网上找不到!但是

我有点问题,希望有人能回答这个问题。我有一个深度缩放项目,我使用了标准的(深度缩放作曲家)项目,该项目在MultiScale图像控件上放置了一个深度缩放器行为。我试图限制拖动,以确保用户不会将图像拖离屏幕(因此无法找到图像)。我添加了一个Home按钮,它会以1的缩放比例将图像恢复到起始位置。无论如何,这是我目前拥有的代码(已经在互联网上搜寻答案)


我真的需要一个适用于右下角的解决方案,但当我放大所有值时,所有值都会发生变化。如果缩放级别为1,则我的限制代码有效。我不敢相信这在互联网上找不到!但是一旦缩放改变,所有的东西都会消失(newPoint的值不在我期望的范围内)。任何帮助都会很棒

就这样,我自己找到了答案(几周后终于找到了答案)

下面是答案(简单地更改鼠标移动事件,如下所示):

msi.MouseMove+=委托(对象发送方,MouseEventArgs e)
{
lastMousePos=e.GetPosition(msi);
如果(拖动期间)
{
Point newPoint=lastMouseViewPort;
newPoint.X+=(lastMouseDownPos.X-lastMousePos.X)/msi.ActualWidth*msi.ViewportWidth;
newPoint.Y+=(lastMouseDownPos.Y-lastMousePos.Y)/msi.ActualWidth*msi.ViewportWidth;
var limits=新Rect(新点(1,1/msi.AspectRatio),新点(-1/Settings.ZoomLevel,-1/msi.AspectRatio/Settings.ZoomLevel));
如果(newPoint.Xlimits.Right*.999)
{
newPoint.X+=(-2*(lastMouseDownPos.X-lastMousePos.X))/msi.ActualWidth*msi.ViewportWidth;//我们向左走,所以X方向相反
}
if(newPoint.Ylimits.Bottom*.999)
{
newPoint.Y+=(-2*(lastMouseDownPos.Y-lastMousePos.Y))/msi.ActualWidth*msi.ViewportWidth;//我们离开顶部,所以方向相反
}
msi.ViewportOrigin=lastMouseViewPort=newPoint;
lastMouseDownPos=lastMousePos;
msi.sendmavedzoommsg(Settings.ZoomLevel、newPoint、myClassName);
}
};

这可能不会完全约束图像,但它会将图像保留在屏幕上,用户很可能会停止尝试向错误方向移动。我相信以下代码正确地确定了视口原点是否将图像的某些部分保留在屏幕上。(ImageCtrl是多尺度图像的类变量)

        // msi is the multiscale image
        msi.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e)
        {
            lastMouseDownPos = e.GetPosition(msi); // class level var
            lastMouseViewPort = msi.ViewportOrigin; // class level var

            mouseDown = true; // class level var

            msi.CaptureMouse();
        };

        msi.MouseMove += delegate(object sender, MouseEventArgs e)
        {
            lastMousePos = e.GetPosition(msi);

            if (duringDrag) 
            {
                Point newPoint = lastMouseViewPort;

                newPoint.X += (lastMouseDownPos.X - lastMousePos.X) / msi.ActualWidth * msi.ViewportWidth;
                newPoint.Y += (lastMouseDownPos.Y - lastMousePos.Y) / msi.ActualWidth * msi.ViewportWidth;

                var limits = new Rect(new Point(1, 1 / msi.AspectRatio), new Point(-1, -1 / msi.AspectRatio));

                if (newPoint.X > limits.Right * .999)
                {
                    newPoint.X += (-2 * (lastMouseDownPos.X - lastMousePos.X)) / msi.ActualWidth * msi.ViewportWidth; // Reverses direction when going off left

                }

                if (newPoint.Y > limits.Bottom * .999)
                {
                    newPoint.Y += (-2 * (lastMouseDownPos.Y - lastMousePos.Y)) / msi.ActualWidth * msi.ViewportWidth; // Reverses direction when going off top of screen
                }

                msi.ViewportOrigin = lastMouseViewPort = newPoint;
                lastMouseDownPos = lastMousePos;
            }
        };
        msi.MouseMove += delegate(object sender, MouseEventArgs e)
        {
            lastMousePos = e.GetPosition(msi);

            if (duringDrag) 
            {
                Point newPoint = lastMouseViewPort;

                newPoint.X += (lastMouseDownPos.X - lastMousePos.X) / msi.ActualWidth * msi.ViewportWidth;
                newPoint.Y += (lastMouseDownPos.Y - lastMousePos.Y) / msi.ActualWidth * msi.ViewportWidth;
                var limits = new Rect(new Point(1, 1 / msi.AspectRatio), new Point(-1 / Settings.ZoomLevel, -1 / msi.AspectRatio / Settings.ZoomLevel));

                if (newPoint.X < limits.Left * .999)
                {
                    newPoint.X += (-2*(lastMouseDownPos.X - lastMousePos.X)) / msi.ActualWidth * msi.ViewportWidth;  // we went off right so reverse X direction

                }
                if (newPoint.X > limits.Right * .999)
                {
                    newPoint.X += (-2 * (lastMouseDownPos.X - lastMousePos.X)) / msi.ActualWidth * msi.ViewportWidth; // we went off left so reverse X direction
                }
                if (newPoint.Y < limits.Top * .999)
                {
                    newPoint.Y += (-2*(lastMouseDownPos.Y - lastMousePos.Y)) / msi.ActualWidth * msi.ViewportWidth;  // we went off Bottom so reverse direction
                }
                if (newPoint.Y > limits.Bottom * .999)
                {
                    newPoint.Y += (-2 * (lastMouseDownPos.Y - lastMousePos.Y)) / msi.ActualWidth * msi.ViewportWidth; // we went off Top so reverse direction
                }
                msi.ViewportOrigin = lastMouseViewPort = newPoint;
                lastMouseDownPos = lastMousePos;

                msi.SendMovedZoomMsg(Settings.ZoomLevel, newPoint, myClassName);
            }
        };
    private bool IsValidOrigin(Point point)
{
  var limits = new Rect(
                 new Point(-0.95 * ImageCtrl.ViewportWidth, -0.85 * ImageCtrl.ViewportWidth/ ImageCtrl.AspectRatio), 
                 new Point(0.95, 0.85/ImageCtrl.AspectRatio));
  return limits.Contains(point);
}