我使用滚轮使用以下方法放大和缩小对象:
void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
lastMousePositionOnTarget = Mouse.GetPosition(grid);
double max = 255;
double min = .005;
var deltaScale = Math.Max(Math.Log(scaleTransform.ScaleX), double.Epsilon);
var delta = e.Delta > 0 ? Math.Max(e.Delta * deltaScale, .5) : Math.Min(e.Delta * deltaScale, -.5);
double newScale = Math.Max(Math.Min((delta / 250d) + scaleTransform.ScaleX, max), min);
scaleTransform.ScaleX = newScale;
scaleTransform.ScaleY = newScale;
System.Diagnostics.Debug.WriteLine(newScale);
e.Handled = true;
}
我想让它在接近最大值时放大更慢,当数字接近最小值时更快。我目前有什么作品,但不是很好。我怎样才能解决这个问题呢?
答案 0 :(得分:2)
假设我明白这一点,你希望你的deltaScale
在放大时变大,但在缩小时变小。从而可以在近距离时快速变焦,在远处进行慢速变焦。
如果scaletransform.ScaleX
因放大而变小,请尝试以下操作:
var deltaScale = Math.Max(K * 1/(scaleTransform.ScaleX), double.Epsilon);
其中K只是一些常见问题,直到感觉正确为止。
如果scaletransform.ScaleX
因放大而变大,请尝试像日志一样的系数,其系数大于1:
var deltaScale = Math.Max(5*Math.Log(scaleTransform.ScaleX), double.Epsilon);
答案 1 :(得分:1)
首先,我不会使用值e.Delta进行计算(当然需要使用符号)。这个值不是很可靠 - 根据我的经验,它接近随机噪音。而是使用常量值或某些计数器,例如调用连续放大的次数以及调用连续放大的次数。
所以我的第一次尝试(具有恒定值)会看起来像这样。
void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
lastMousePositionOnTarget = Mouse.GetPosition(grid);
double max = 255;
double min = .005;
var deltaScale = Math.Max(Math.Log(scaleTransform.ScaleX), double.Epsilon);
var delta = e.Delta > 0 ? Math.Max(1 * deltaScale, .5) : Math.Min(1 * deltaScale, -.5);
double newScale = Math.Max(Math.Min((delta / 250d) + scaleTransform.ScaleX, max), min);
scaleTransform.ScaleX = newScale;
scaleTransform.ScaleY = newScale;
System.Diagnostics.Debug.WriteLine(newScale);
e.Handled = true;
}
带计数器的版本看起来像这样。
private double counter=0;
private bool isZoomIn=true;
void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
lastMousePositionOnTarget = Mouse.GetPosition(grid);
if( (e.Delta > 0 && isZoomIn) || (e.Delta < 0 && !isZoomIn))
IncreaseCounter(counter);//is another one in a row
else
counter=1;
isZoomIn = e.Delta > 0;//we set this flag for next time
double max = 255;
double min = .005;
var deltaScale = Math.Max(Math.Log(scaleTransform.ScaleX), double.Epsilon);
var delta = e.Delta > 0 ? Math.Max(counter * deltaScale, .5) : Math.Min(counter * deltaScale, -.5);
double newScale = Math.Max(Math.Min((delta / 250d) + scaleTransform.ScaleX, max), min);
scaleTransform.ScaleX = newScale;
scaleTransform.ScaleY = newScale;
System.Diagnostics.Debug.WriteLine(newScale);
e.Handled = true;
}
请注意,我使用了伪函数IncreaceCounter而不仅仅是incrementaion,因为除了线性增加之外你可能还需要其他东西。
答案 2 :(得分:1)
这是我的最终答案,如果不是GEEF&amp ;;我就无法想出来。 Pawel非常感谢他们给予他们最好的拍摄。
void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
double max = 255;
double min = .005;
double scaler = 4;
var deltaScale = Math.Min(Math.Max(scaler * scaleTransform.ScaleX / max, min),1) * Math.Sign(e.Delta);
double newScale = Math.Max(Math.Min(deltaScale + scaleTransform.ScaleX, max), min);
scaleTransform.ScaleX = newScale;
scaleTransform.ScaleY = newScale;
e.Handled = true;
}
我使用当前比例与最大值的比率来获得斜率 - 并且不允许它快速(最大1)或太慢,min ==最小比例。工作正常。