2009-06-23 5 views
11

Fare tekerini kullanarak bir Tuvali yakınlaştırıp uzaklaştırabilmem gerekir. Fare tekerleği işleyicilerini başarıyla kurdum ve yakınlaştırmayı uygulamak için şu anda bir ScaleTransform kullanıyorum; Ancak, ölçeklendirme "sezgisel" bir şekilde yapılmaz.Silverlight 3 - ScaleTransform veya bir tuvali yakınlaştırmak için başka bir yöntem mi?

MultiScaleImage, Google Maps/Earth veya Adobe Acrobat Reader'da görebileceğiniz gibi, aynı "yakınlaştırma" stilini gerçekleştirmeye çalışıyorum - ancak bir görüntü ile birlikte, bir kontrol ile. Geçişin "pürüzsüz" veya animasyonlu olması gerekmez (daha kolay bir yaklaşım değilse), ancak işlevsellik aynı olmalıdır.

Herhangi bir düşünce veya fikir çok takdir edilecek ve şimdiden teşekkürler!

Düzenleme:

_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 

Ancak mesele hala dışarı yakınlaştırma olduğunu ortaya: Aşağıdaki kodu ile

<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> 

: Ben "pürüzsüz" zoom kullanarak animasyon başardınız Google Haritalar gibi zumun farenin "etrafında" olduğu yerlerin aksine, sol üst köşede.

cevap

10

Fare konumunu temel alarak yakınlaştırma merkezi olarak ağırlıklı ortalama kullanmanız gerekir. Diğer bir deyişle, en son yakınlaştırma merkezini (ya da henüz mevcut fare pozisyonuna ayarlamamışsanız) tutun ve zoom merkezinin hesaplanma sayısını (ilk yakınlaştırmadan sonra 1 olur) tutun. . Yakınlaştırma merkezini her yeniden hesapladığınızda, bu değeri artırın.

: ZoomSteps biz yakınlaştırılmış ettik kaç kez, deltaZoom centerX ve Centery geçerli yakınlaştırma merkezi, sen yakınlaştırma konum ne kadar olduğunu ve mouseX ve mouseY geçerli fare pozisyonu vardır -

Örnek Kod Şöyledir

_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(); 

1.0 zum seviyesinin altına düşebilmeniz için düzenlenmiş ancak bazı problemler var (ZoomStep = -1, 0 veya 1 bazen garip sarsıntılara neden olabilir).

+0

Kaynak için teşekkürler :) +1 –

+0

CenterAnimation nedir? – Erix

İlgili konular