我有一些问题,我希望有人能回答这个问题。我有一个Deep Zoom项目,我使用了标准的(deep zoom composer)项目,它在MultiScaleImage控件上放置了一个DeepZommInitializer行为。我正在尝试限制拖动,以确保用户不会将图像拖出屏幕(因此无法找到图像)。我确实添加了一个Home按钮,它会将图像以1的缩放比例带回起始位置。不管怎样,这是我目前拥有的代码(我已经在互联网上寻找答案)。
// 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;
}
};我真的需要一个适用于右边和底部的解决方案,但是当我放大所有的值时,所有的值都会改变。如果缩放级别是1,我的limit代码就可以工作。我不敢相信在互联网上找不到它!但是,当缩放发生变化时,一切都会消失( newPoint的值不在我期望的范围内)。任何帮助都是很棒的!
发布于 2010-06-19 00:22:03
就这样,我自己想明白了(几周后终于明白了)。
以下是答案(简单地更改鼠标移动事件,如下所示):
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);
}
};这可能不会完全限制图像,但它会将图像保留在屏幕上,并且用户很可能会停止尝试向错误的方向移动
发布于 2011-04-08 12:06:11
我相信下面的代码正确地确定了ViewportOrigin是否在屏幕上留下了图像的某一部分。(ImageCtrl是MultiScaleImage的类变量)。
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);
}https://stackoverflow.com/questions/3071340
复制相似问题