我是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