2010-06-18 8 views
0

У меня возникла проблема, и я надеюсь, что кто-то сможет ответить на вопрос. У меня есть проект Deep Zoom, в котором я использовал стандартный проект с глубоким масштабированием, который помещает поведение DeepZommInitializer в элемент управления MultiScaleImage. Я пытаюсь сдержать перетаскивание, чтобы убедиться, что пользователь не перетаскивает изображение с экрана (и, следовательно, не может найти изображение). Я добавил кнопку «Домой», которая вернет изображение в исходное местоположение с увеличением 1. Во всяком случае, вот код, который я сейчас имею (просмотрел в Интернете, ища ответ).Silverlight DeepZoom Dragging позволяет перетащить MultiScaleImage с экрана

 // 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. Я не могу поверить, что этого не найти в Интернете! Но в тот момент, когда изменяется масштаб, все выходит из окна (значения для newPoint не соответствуют ожидаемому диапазону). Любая помощь будет фантастической!

ответ

0

И точно так же я понял это сам (наконец, через несколько недель).

Вот ответ (простое изменение события движения мыши следующим образом):

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

Это, вероятно, не полностью ограничивает изображение, но он держит его на экране и более чем вероятно, пользователь перестанет пытаться для перемещения в неправильном направлении

+0

grt, что u найти решение. Вы можете отметить собственный ответ :) – Malcolm

0

Я верю, что следующий код правильно определяет, оставляет ли 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); 
}