2011-07-06 185 views
0

我遇到了一個奇怪的問題,在WPF中的渲染轉換。我正在處理的項目需要在圖像上顯示點擊的用戶點。當用戶點擊某個點時,自定義控件將被放置在點擊位置。然後應該可以使用鼠標滾輪在任意點縮放圖像,並且自定義控件應該是翻譯爲(未縮放)到正確的位置。WPF渲染變換行爲奇怪

爲此,我按照MouseWheel事件如下:

private void MapPositioner_MouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    Point location = Mouse.GetPosition(MainWindow.Instance.imageMap); 

    MainWindow.Instance.imageMap.RenderTransform = null; 

    ScaleTransform st = new ScaleTransform(scale + (e.Delta < 0 ? -0.2 : 0.2), scale += (e.Delta < 0 ? -0.2 : 0.2)); 
    st.CenterX = location.X; 
    st.CenterY = location.Y; 


    TransformGroup tg = new TransformGroup(); 
    tg.Children.Add(st); 
    //tg.Children.Add(tt); 

    MainWindow.Instance.imageMap.RenderTransform = tg; 

    if (scale <= 1) 
    { 
     MainWindow.Instance.imageMap.RenderTransform = null; 
    } 

    if (TransformationChanged != null) 
     TransformationChanged(); 
} 

然後,我實現在用於在上面的代碼塊的端部看如下TransformationChanged事件定製控制的事件處理程序:

private void Instance_TransformationChanged() 
    { 
     //check image coords 
     // 
     if (MainWindow.Instance.imageMap.RenderTransform != null) 
     { 
      if (MainWindow.Instance.imageMap.RenderTransform != Transform.Identity) 
      { 
       Transform st = MainWindow.Instance.imageMap.RenderTransform; 

       Point image = MainWindow.VideoOverlayCanvas.TransformToVisual(MainWindow.Instance.MapImage).Transform(loc2); 

       Point trans = st.Transform(image); 

       Point final = MainWindow.Instance.MapImage.TransformToVisual(MainWindow.VideoOverlayCanvas).Transform(trans); 

       // selected = anchor2; 
       // final = ClipToOverlay(final); 
       // selected = null; 

       connector.X2 = final.X; 
       connector.Y2 = final.Y; 

       Canvas.SetLeft(anchor2, final.X); 
       Canvas.SetTop(anchor2, final.Y);      
      } 
     } 
     else 
     { 
      connector.X2 = loc2.X; 
      connector.Y2 = loc2.Y; 

      Canvas.SetLeft(anchor2, loc2.X); 
      Canvas.SetTop(anchor2, loc2.Y); 
     } 
    } 

這樣,我可以確保自定義控件的位置只有在設置新變換後纔會更新。請注意,由於我正在將轉換應用到點,因此沒有對控件進行縮放,結果是它已轉換爲它應該的點。只要用戶只能縮放一點,此功能就可以正常工作。如果他們改變這一點,它就無法工作。 這裏有一些圖片,展示了問題:

User clicks a point

user zooms out, what happened here?

after zooming out (all the way out in this case) it looks ok

我一直在搞亂這兩天左右,所以我道歉,如果我的代碼看起來雜亂無章。我知道這是一個非常晦澀的問題,所以任何幫助將不勝感激。

感謝, 最大

回答

1

如果有人因爲截止日期尋找答案,我必須編寫一個解決方法,讓用戶用鼠標右鍵平移並用鼠標滾輪放大。這種方式總是在圖像的中心發生縮放,所以控件總是排列整齊。我還在尋找答案,雖然原來的問題,如果任何人都可以計算出來

感謝,

最大

0

我不知道有什麼不對您的轉換,但你有沒有考慮替代的方法呢?例如,您可能想要添加一個透明畫布集,以保持與圖像大小相同,z上方的圖像順序(明確設置或僅將Canvas元素放在圖像元素之後)。然後,您可以使用Canvas.SetLeft和Canvas.SetTop將用戶控件放置在用戶單擊的位置,並將其移動。比使用變換要容易得多。

+0

這就是我做的其實正是。您會注意到第二個列表中的Canvas.SetLeft()'/'Canvas.SetTop()'調用完全按照您的說法進行操作。問題是我需要在縮放圖像時移動這些東西。 –

+0

如同對圖像應用相同的ScaleTransform到畫布不起作用? –

+0

只要用戶放大和縮小同一點,它就會工作。 'ScaleTransform'具有兩個屬性'CenterX'和'CenterY',它們確定縮放的中心點。如果用戶在同一點放大和縮小鼠標,一切正常,但如果用戶放大一個點,移動鼠標,然後縮小,翻譯不能正常工作,最終會出現類似於我包括在我的文章中的圖像。 –