我是WPF的新手,正在尝试编写可点击的缩放平移图像控件。我已经有一个缩放 - 摇动图像,这似乎工作:PanZoomImage的像素选择
<Border Name="border" ClipToBounds="True">
<Canvas>
<Image Name ="image">
Source="{Binding Path=Source}"
MouseLeftButtonDown="image_MouseLeftButtonDown"
MouseLeftButtonUp="image_MouseLeftButtonUp"
MouseMove="image_MouseMove"
MouseWheel="image_MouseWheel">
</Image>
</Canvas>
</Border>
鼠标和滚轮事件我用这篇文章:http://www.codeproject.com/Articles/168176/Zooming-and-panning-in-WPF-with-fixed-focus
我从ZoomPanImage继承和添加事件写入可点击控制为LeftMouseUp。
public class ClickableImage : PanZoomImage
{
public event Action<Point> Click;
//...
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonUp(e);
// ... all sorts of checks to distinguish click from mouse move
if (Click != null)
{
Click(ControlToImage(mouseUpCoordinates));
}
}
protected Point ControlToImage(Point controlPixel)
{
//this is where i am stuck...
}
}
我的问题是,我似乎无法计算给定控制坐标的正确图像坐标。我需要考虑到图像可以放大和平移,窗口本身可以调整大小。
我尝试过使用渲染转换。当我缩放和平移图像时,我更新了变换。当我尝试将控制坐标转换为图像坐标时,我使用反变换:
Point imagePixel = image.RenderTransform.Inverse.Transform(controlPixel);
但是这并不奏效。其中一个问题是变换是以身份开始的,而实际上图像被均匀地拉伸到控件的大小。
感谢, 迪娜
请确保您设置[Image.Stretch(http://msdn.microsoft.com/en-us/library/system.windows.controls。 image.stretch.aspx)属性设置为'None',然后应用RenderTransform。 – Clemens 2012-02-20 18:36:40
@Clemens,是的,我做到了。这个解决方案的问题是,最初的图像比窗口大。我希望根据窗口大小调整大小。所以我尝试添加一个回调函数,它在图像源被更改后立即调用,并将更改变换。但是这不起作用,因为当回调被称为image.actualHeight和image.actualWidth仍然是0 ... – Dina 2012-02-20 19:54:37
当你设置Source属性(我假设在代码后面),你将它设置为一些[ImageSource](http: //msdn.microsoft.com/en-us/library/system.windows.media.imagesource.aspx) - 派生类,例如的BitmapSource。从ImageSource的Width和Height属性获取图像大小,并相应地设置RenderTransform。无论如何,如果你想手动执行,你必须避免自动缩放。 – Clemens 2012-02-20 20:22:09