私はWPFを初めて使用しており、クリック可能なズームパン画像コントロールを作成しようとしています。 http://www.codeproject.com/Articles/168176/Zooming-and-panning-in-WPF-with-fixed-focusPanZoomImageのピクセル選択
私はZoomPanImageから継承し、イベントを追加することにより、クリック可能な制御を書いています:マウスホイールイベントでは
<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>
が、私はこのポストを使用:私はすでに動作しているようですズームパンイメージを持っています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);
これはうまくいきませんでした。問題の1つは、変換がアイデンティティとして開始され、実際にはイメージがコントロールのサイズに均一に引き伸ばされることです。
おかげで、 ディナ
あなたは[Image.Stretch](http://msdn.microsoft.com/en-us/library/system.windows.controlsを設定していることを確認してください。 image.stretch.aspx)プロパティを「None」に設定してから、RenderTransformを適用します。 – Clemens
@クレメンス、はい、私はそれをしました。この解決法の問題点は、最初は画像がウィンドウよりも大きいことです。ウィンドウサイズに合わせてサイズを変更したい。そこで、画像のソースが変更された直後に呼び出され、変換を変更するコールバックを追加しようとしました。しかし、コールバックがimage.actualHeightとimage.actualWidthと呼ばれていたときにも0 ... – Dina
ソースプロパティを設定すると(コードの後ろにあると仮定して)、[ImageSource](http: //msdn.microsoft.com/en-us/library/system.windows.media.imagesource.aspx)-誘導されたクラス、例えばBitmapSource。 ImageSourceのWidthプロパティとHeightプロパティからイメージサイズを取得し、それに応じてRenderTransformを設定します。とにかく、手動スケーリングをしたい場合は、自動スケーリングを避けなければなりません。 – Clemens