2011-09-14 134 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

你必須與你的翻譯部分,而縮放一個TranslateTransform譜寫自己的ScaleTransform。

由TranslateTransform指定的偏移量取決於你想有行爲(即在鼠標中心,中心在屏幕中心......)

我在過去,你可以連接到一個部件的行爲寫道:這使得它的可縮放的(集中於鼠標,反應滾輪) 這是很骯髒,不知道是有效的(我不再使用它)...和意見是法語: -/

see the source

[編輯]其實我記得它是滾動和縮放Panels背景。但它不應該很難修改應用於任何對象,因爲圖像和元素的轉換是相同的。

+0

感謝您的理解,我認爲在縮放時每次將畫布轉換爲鼠標位置可能會非常有用,從而爲用戶提供了放大鼠標光標的感覺。 –

+0

順便說一句,評論是英語,所以不要擔心:) –