Ответ 1
Вам нужно использовать средневзвешенное значение в качестве центра масштабирования на основе положения мыши. Другими словами, держите последний центр масштабирования (или если у вас его еще нет, просто установите его в текущую позицию мыши) и сохраните количество раз, когда рассчитывался центр масштабирования (после первого увеличения, что будет 1), Затем каждый раз, когда вы пересчитываете центр масштабирования, увеличивайте этот параметр var.
Пример кода: deltaZoom - это масштаб масштабирования, centerX и centerY - текущий центр масштабирования, ZoomStep - это количество раз, когда мы увеличили масштаб, а mouseX и mouseY - текущая позиция мыши:
_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, но все еще есть некоторые проблемы (ZoomStep = -1, 0 или 1 иногда вызывает странные тряски).