Изменение центральной точки увеличения / уменьшения - PullRequest
1 голос
/ 14 сентября 2011

Я пишу приложение WPF, которое отображает объект XAML (это в основном карта, нарисованная в XAML). Как часть его функций, он должен увеличивать / уменьшать и панорамировать. Панорамирование работает отлично, и масштабирование увеличивается, но я не совсем понимаю, как увеличить масштаб до определенной точки, например, моего курсора мыши.

Это мой текущий код:

internal void PerformZoom(float ZoomFactor, Point ZoomCenterPoint)
{
  m_originalTransform = m_canvas.RenderTransform;
  float newZoomFactor = m_oldZoomFactor + ZoomFactor;

  float scaleToApply = (newZoomFactor / m_oldZoomFactor);
  m_totalZoom = newZoomFactor;

  var st = new ScaleTransform(scaleToApply, scaleToApply);

  TransformGroup tg = new TransformGroup();
  tg.Children.Add(m_originalTransform);
  tg.Children.Add(st);
  m_canvas.RenderTransform = tg;

  m_oldZoomFactor = newZoomFactor;
}

[править] Нашли решение - Просто отредактировали свойства преобразования CenterX / CenterY, и это сработало как шарм. Спасибо за вашу помощь!

[edit2] Вот жизнеспособное решение (с учетом положения мыши):

public partial class MainWindow
{
    private float currentZoom = 1f;
    private const float StepSize = .2f;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void MainGrid_OnMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var pos = 1;
        if (e.Delta < 0)
        {
            pos = -1;
        }

        var mousePosition = e.MouseDevice.GetPosition(MainGrid);

        currentZoom += StepSize * pos;
        var transform = new ScaleTransform(currentZoom, currentZoom, mousePosition.X, mousePosition.Y);
        MainGrid.RenderTransform = transform;
    }
}

1 Ответ

2 голосов
/ 14 сентября 2011

Вам нужно будет составить ваше ScaleTransform с TranslateTransform, который переводит ваш компонент при масштабировании.

Смещение, заданное TranslateTransform, зависит от поведения, которое вы хотите иметь (то есть по центру мыши, центру по центру экрана...)

В прошлом я писал поведение, которое вы можете прикрепить к компоненту: оно делает его масштабируемым (центрируется на мышке, реагирует на колесико мыши) Это довольно грязно и не обязательно будет эффективным (я больше неиспользуйте его) ... и комментарии на французском: - /

см. источник

[править] На самом деле, я помню этодолжен был прокрутить и масштабировать фон Панелей.Но это не должно быть так сложно изменить для применения к любому объекту, так как преобразования одинаковы для изображений и элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...