2012-01-17 6 views
1

Expression Blendでは、マウスホイールをスクロールすると、画面上の要素がズームイン/ズームアウトされ、マウスの位置に焦点を当てます。Expression Blendでのズームの実装

自分のプロジェクトで同じズームを実装しようとしていますが、ズーム後、マウスを動かしてから再びズームすると問題が発生します。

これまではScaleTransformのマウス座標をcenterX、ScaleTransformのcenterYを使用してScaleTransformでRenderTransformを使用しています。

Expression Blendでどのように行ったのか、誰でも知っていますか?

これは私がこれまで何をやったかである:

private void ScrollCanvasMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     double zoomAmnt = e.Delta > 0 ? 0.2 : -0.2; 
     _scaleTransformAmount += zoomAmnt; 

     if (_scaleTransformAmount < 0.5) 
      _scaleTransformAmount = 0.5; 

     Point position = e.GetPosition(ScrollCanvas); 

     var scaleTransform = ScrollCanvas.RenderTransform as ScaleTransform; 
     if (scaleTransform == null) throw new ArgumentNullException("scaleTransform"); 

     scaleTransform.ScaleX = _scaleTransformAmount; 
     scaleTransform.ScaleY = _scaleTransformAmount; 
     scaleTransform.CenterX = position.X; 
     scaleTransform.CenterY = position.Y; 
    } 

答えて

2

ズームのその種類は非常に私は一度それを実装しようとした、それの数学は少し奇妙ですいいです、それは約2日かかりました(_持つ変数は、ズームコントロールのフィールドです)けれどもそれが働いたから何かを把握するために、これはかなり醜いコードのようになります。

Point cursorPos = e.GetPosition(this); 
Point newCenter = _scaleT.Inverse.Transform(_translateT.Inverse.Transform(cursorPos)); 
Point oldCenter = new Point(_scaleT.CenterX, _scaleT.CenterY); 
Vector oldToNewCenter = newCenter - oldCenter; 
_scaleT.CenterX = newCenter.X; 
_scaleT.CenterY = newCenter.Y; 
_translateT.X += oldToNewCenter.X * (_scaleT.ScaleX - 1.0); 
_translateT.Y += oldToNewCenter.Y * (_scaleT.ScaleY - 1.0); 

_scalingAnimation.From = _scaleT.ScaleX; 
if (e.Delta > 0) 
{ 
    _scalingAnimation.To = _scaleT.ScaleX * ZoomScaleChangeFactor; 
} 
else 
{ 
    _scalingAnimation.To = _scaleT.ScaleX/ZoomScaleChangeFactor; 
} 
_scaleT.BeginAnimation(ScaleTransform.ScaleXProperty, _scalingAnimation); 
_scaleT.BeginAnimation(ScaleTransform.ScaleYProperty, _scalingAnimation); 

this.ReleaseMouseCapture(); 

変換の順序はもちろん重要です:

TransformGroup tGroup = new TransformGroup(); 
tGroup.Children.Add(_scaleT); 
tGroup.Children.Add(_translateT); 
+0

これは私が試したことが想像していたものとは根本的に異なる方法ですが、私はそれを試してみましょう! '_scalingAnimation'フィールドはどのような型ですか? – Siyfion

+0

私はそれを 'DoubleAnimation'としていて、それはうまくいくとは心配しないでください。全体的な効果については、私が望むものに近いが、それほどではない。私はあなたが本当に半分の方法でズームインできないことを知っています。次に、ズーム "フォーカス"を別のエリアに非常に効果的に切り替えます。それは正しい方向に少しだけ動きますが、しばらくするとフォーカスポイントが画面から消えます。 – Siyfion

+0

本当ですか?それは私に起こったことはありませんでした。多分、変換が適用されているコントロールとは異なるコントロールからポイントを得るかもしれませんか? –

関連する問題