私はThumbクラスを使用して、ユーザーがキャンバス上で画像をドラッグアンドドロップできるようにしています。右ボタンが押されたら、ユーザーが画像を回転できるようにしたいと思います。回転は画像の中心を中心に行われます。私は次のXAMLコードを持っています
<Grid>
<Canvas Background="Red" Grid.RowSpan="2" x:Name="canvas"
PreviewMouseRightButtonUp="Canvas_MouseUp"
PreviewMouseMove="Canvas_MouseMove">
<UserControl MouseRightButtonDown="Canvas_MouseDown" RenderTransformOrigin="0.5,0.5">
<Thumb Name="myRoot" DragDelta="myRoot_DragDelta">
<Thumb.Template>
<ControlTemplate>
<Grid>
<Image Source="/WpfApplication1;component/someImage.png" />
<Rectangle Stroke="#FF0061CE" StrokeThickness="1" Width="230" Height="250" />
</Grid>
</ControlTemplate>
</Thumb.Template>
</Thumb>
<UserControl.RenderTransform>
<TransformGroup>
<RotateTransform x:Name="rotateTransform" />
<TranslateTransform x:Name="translateTransform" />
</TransformGroup>
</UserControl.RenderTransform>
</UserControl>
</Canvas>
</Grid>
そして、このコードの背後にある
bool isMouseDown = false;
Point pos;
double lastAngle = 0;
private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
isMouseDown = true;
lastAngle = rotateTransform.Angle;
pos = Mouse.GetPosition(canvas);
}
private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
{
isMouseDown = false;
}
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if (!isMouseDown) return;
var curPos = Mouse.GetPosition(canvas);
rotateTransform.Angle = lastAngle + (pos.Y - curPos.Y);
}
private void myRoot_DragDelta(object sender, DragDeltaEventArgs e)
{
translateTransform.X += e.HorizontalChange;
translateTransform.Y += e.VerticalChange;
}
画面上で画像をドラッグアンドドロップし、画像を少し回転させるだけで機能します(どの方向にも50度で問題ないようです)。ただし、それ以上に操作すると、画像が画面上を予期せず動き始めます。
変換を別のコントロールに移動しようとしましたが、それらを混同しないようにしていますが、許容できる結果は得られていません。
コードを希望どおりに動作させるにはどうすればよいですか?
更新:これは私の狂気を駆り立てています。代わりにMatrixTransformationを使用するようにコードとXAMLを変更しました
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if (!isMouseDown) return;
var curPos = Mouse.GetPosition(canvas);
angle = (lastAngle + (pos.Y - curPos.Y)) % 360;
UpdateMatrixTransform();
}
private void myRoot_DragDelta(object sender, DragDeltaEventArgs e)
{
posX += e.HorizontalChange;
posY += e.VerticalChange;
UpdateMatrixTransform();
}
void UpdateMatrixTransform()
{
Matrix m = new Matrix();
m.Rotate(angle);
m.OffsetX = posX;
m.OffsetY = posY;
matrixT.Matrix = m;
}
私の考えでは、これは機能するはずです。まず、グラフィックをオフセットに移動するよりも回転させます。期待どおりに動作しません。画像を回転させますが、マウスを動かし続けると不思議なことにスパイラル状に外側に移動します。私が何をしても、どのような順序で変換を実行しても、機能しません。