2011-07-06 188 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',它们确定缩放的中心点。如果用户在同一点放大和缩小鼠标,一切正常,但如果用户放大一个点,移动鼠标,然后缩小,翻译不能正常工作,最终会出现类似于我包括在我的文章中的图像。 –