我在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
我现在已经搞这两天了,所以如果我的代码看起来很乱,我会道歉。我知道这是一个非常模糊的问题,所以任何帮助都会受到赞赏。
谢谢, 最大
答案 0 :(得分:1)
如果有人正在寻找答案,由于截止日期,我必须通过让用户使用鼠标右键平移并使用鼠标滚轮进行缩放来编写解决方法。这种方式缩放总是发生在图像的中心周围,所以控件总是排成一行。如果有人能搞清楚,我仍在寻找原始问题的答案
谢谢,
最高
答案 1 :(得分:0)
我不确定你的变换有什么问题,但你考虑过另一种方法吗?例如,您可能希望添加透明画布集以保持与图像相同的大小,在图像上方保持z顺序(显式设置或仅将Canvas元素放在图像元素之后)。然后,您可以使用Canvas.SetLeft和Canvas.SetTop将用户控件放在用户单击的位置,并移动它。比使用转换容易得多。