2009-06-23 10 views
11

Tôi cần có thể phóng to và thu nhỏ Canvas bằng cách sử dụng con lăn chuột. Tôi đã thiết lập thành công trình xử lý bánh xe chuột và hiện đang sử dụng ScaleTransform để áp dụng thu phóng; tuy nhiên, việc chia tỷ lệ không được thực hiện theo cách "trực quan".Silverlight 3 - ScaleTransform hoặc phương pháp khác để phóng to trong Canvas?

Tôi đang cố gắng thực hiện cùng một kiểu "thu phóng" như bạn có thể thấy trong MultiScaleImage, Google Maps/Earth hoặc Adobe Acrobat Reader - nhưng KHÔNG có hình ảnh có kiểm soát. Quá trình chuyển đổi không cần phải "mượt mà" hoặc hoạt ảnh (trừ khi đó là cách tiếp cận dễ dàng hơn), nhưng chức năng cần phải giống nhau.

Bất kỳ ý tưởng hay ý tưởng nào sẽ được đánh giá cao và cảm ơn trước!

Edit: Tôi đã quản lý để "trơn tru" zoom sử dụng hình ảnh động:

<Canvas.Resources> 
      <Storyboard x:Name="ZoomStoryboard"> 
       <DoubleAnimation x:Name="ZoomAnimationX" 
           Storyboard.TargetName="Workspace" 
           Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleX" 
           Duration="0:0:0.2"/> 
       <DoubleAnimation x:Name="ZoomAnimationY" 
           Storyboard.TargetName="Workspace" 
           Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleY" 
           Duration="0:0:0.2"/> 
      </Storyboard> 
     </Canvas.Resources> 

với đoạn mã sau:

_Zoom += (args.Delta/7); 
if (_Zoom < 0.15) 
    _Zoom = 0.15; 
ZoomAnimationX.To = _Zoom; 
ZoomAnimationY.To = _Zoom; 
ZoomStoryboard.Begin(); 
ZoomScale.Text = _Zoom.ToString("0.00") + "x"; 
_PreviousMousePosition = _CurrentMousePosition 

Tuy nhiên, vấn đề này vẫn phát sinh mà nó được thu nhỏ của góc trên cùng bên trái, trái ngược với các trang web như Google Maps, nơi phóng to "xung quanh" con chuột.

Trả lời

10

Bạn cần sử dụng mức trung bình có trọng số làm trung tâm thu phóng dựa trên vị trí chuột. Nói cách khác, hãy giữ trung tâm thu phóng mới nhất (hoặc nếu bạn chưa có trung tâm thu nhỏ), và giữ số lần trung tâm thu phóng được tính (sau lần thu phóng đầu tiên, đó sẽ là 1) . Hơn mỗi lần bạn tính toán lại trung tâm thu phóng, tăng thêm var đó.

Ví dụ Mã sau - deltaZoom là bạn đang phóng to bao nhiêu, centerX và centery là trung tâm zoom hiện tại, ZoomSteps là số lần chúng tôi đã thu nhỏ, và mouseX và mouseY là vị trí chuột hiện tại:

_Zoom += deltaZoom; 
     if (_Zoom <= 0) 
      _Zoom = 0.1; 

     if (deltaZoom >= 0) 
     { 
      if (_ZoomSteps == -1) 
      { 
       _CenterX = 0; 
       _CenterY = 0; 
       _ZoomSteps = 0; 
      } 
      else 
      { 
       _CenterX = (_CenterX * Math.Abs(_ZoomSteps) + mouseX)/(Math.Abs(_ZoomSteps + 1)); 
       _CenterY = (_CenterY * Math.Abs(_ZoomSteps) + mouseY)/(Math.Abs(_ZoomSteps + 1)); 
       _ZoomSteps++; 
      } 
     } 
     else 
     { 
      if (_ZoomSteps == 1) 
      { 
       _CenterX = 0; 
       _CenterY = 0; 
       _ZoomSteps = 0; 
      } 
      else 
      { 
       _CenterX = (_CenterX * Math.Abs(_ZoomSteps) - mouseX)/(Math.Abs(_ZoomSteps - 1)); 
       _CenterY = (_CenterY * Math.Abs(_ZoomSteps) - mouseY)/(Math.Abs(_ZoomSteps - 1)); 
       _ZoomSteps--; 
      } 
     } 

     ZoomAnimationX.To = _Zoom; 
     ZoomAnimationY.To = _Zoom; 
     CenterAnimationX.To = Math.Abs(_CenterX); 
     CenterAnimationY.To = Math.Abs(_CenterY); 
     ZoomStoryboard.Begin(); 

Được chỉnh sửa để bạn có thể giảm xuống dưới mức thu phóng 1.0 nhưng vẫn có một số vấn đề (ZoomStep = -1, 0 hoặc 1 đôi khi gây ra những rung lắc lạ).

+0

Cảm ơn nguồn :) +1 –

+0

CenterAnimation là gì? – Erix