2011-09-14 3 views
1

Я пишу приложение 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; 
    } 
} 
+0

Почему бы вам не показать, что вы сделали кому-то другому, может оказаться полезным. Я понятия не имею, что * свойства CenterX/CenterY преобразования, о котором вы говорили. –

ответ

2

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

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

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

see the source

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

+0

Спасибо за это, я подумал, что при масштабировании может быть полезно переводить холст в местоположение мыши, тем самым давая пользователю ощущение, что он приближается к курсору мыши. –

+0

BTW, комментарии на английском языке, поэтому не беспокойтесь об этом :) –

Смежные вопросы