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