2010-06-18 3 views
0

나는 어떤 문제가있어 누군가가 질문에 대답 할 수 있기를 바랍니다. 나는 DeepScreen 프로젝트에서 DeepScreenImage 컨트롤에 DeepZommInitializer 비헤이비어를 배치하는 표준 (딥 줌 컴포저) 프로젝트를 사용했습니다. 사용자가 이미지를 화면 밖으로 드래그하지 않도록 드래그를 제한하려고합니다. 따라서 이미지를 찾을 수 없습니다. 나는 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

그 해결책을 찾을 수 있습니다. 당신은 자기 자신의 대답을 표시 할 수 있습니다 :) – 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); 
} 
관련 문제