2012-01-17 42 views
1

在Expression Blend中,当您滚动鼠标滚轮时,屏幕上的元素将放大/缩小,并将焦点放在鼠标所在的位置。在Expression Blend中实现缩放

我想在我自己的项目中实现相同的缩放比例,但是我在缩放,移动鼠标然后再次缩放后出现问题。

到目前为止,我正在使用带ScaleTransform的RenderTransform,使用鼠标坐标作为ScaleTransform的centerX和centerY。

有谁知道他们是如何在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

那种变焦的很不错,所以我想一次实现它,它的数学是有点不可思议,我花了两天左右推测出来的东西是工作,这可能是相当丑陋的代码,但(与_变量上的变焦控制字段):

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 2012-01-18 09:20:43

+0

别担心,我把它变成了一个'DoubleAnimation',而且看起来很有效。至于整体效果,它接近我想要的,但不完全。我发现你不能真正放大到一半,然后非常有效地将变焦“聚焦”切换到不同的区域;它朝着正确的方向稍稍移动,但过了一会儿,我的焦点离开了屏幕。 – Siyfion 2012-01-18 10:04:12

+0

真的吗?这从来没有发生在我身上,也许你从不同的控制中得到了转变应用的东西或什么东西? – 2012-01-18 10:22:58