我遇到了一個奇怪的問題,在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 zooms out, what happened here?
after zooming out (all the way out in this case) it looks ok
我一直在搞亂這兩天左右,所以我道歉,如果我的代碼看起來雜亂無章。我知道這是一個非常晦澀的問題,所以任何幫助將不勝感激。
感謝, 最大
這就是我做的其實正是。您會注意到第二個列表中的Canvas.SetLeft()'/'Canvas.SetTop()'調用完全按照您的說法進行操作。問題是我需要在縮放圖像時移動這些東西。 –
如同對圖像應用相同的ScaleTransform到畫布不起作用? –
只要用戶放大和縮小同一點,它就會工作。 'ScaleTransform'具有兩個屬性'CenterX'和'CenterY',它們確定縮放的中心點。如果用戶在同一點放大和縮小鼠標,一切正常,但如果用戶放大一個點,移動鼠標,然後縮小,翻譯不能正常工作,最終會出現類似於我包括在我的文章中的圖像。 –