我要旋转,然后在c#中移动图像。该图像位于“画布”中。我的问题是,如果您使用以下内容旋转图像
private void Schiff_OnMouseWheel(object sender, MouseWheelEventArgs e)
{
Image _schiff = (Image)sender;
if (!_schiff.IsMouseCaptured) return;
Matrix _mat = _schiff.RenderTransform.Value;
Point _mouse = e.GetPosition(_schiff);
if (e.Delta > 0)
{
_mat.RotateAtPrepend(22.5, _mouse.X, _mouse.Y);
}
else
{
_mat.RotateAtPrepend(-22.5, _mouse.X, _mouse.Y);
}
MatrixTransform _mtf = new MatrixTransform(_mat);
_schiff.RenderTransform = _mtf;
}
或RotateTransform
double _angle = 0.0;
_angle += 22.5;
if (_angle == 360.0) _angle = 0.0;
RotateTransform _rotate = new RotateTransform(_angle, _schiff.Width / 2, _schiff.Height / 2);
_schiff.RenderTransform = _rotate;A
您只是旋转“图片”,但不是它的基础。因此,如果要使用Canvas.GetLeft / GetTop移动图像,它的行为就像仍然没有旋转一样。因此,如果您设置“顶角/左角”,则旋转图像的实际角不会放置在我想要的位置。 在https://wpf.2000things.com/2013/03/08/772-use-rendertransformorigin-to-change-center-point-for-rotation-transforms/的图片中,您可以看到我的意思。如何旋转带有实际图像的“底座”?我看到WinForms中有可能,但是(如何)在WPF中工作? 在此先感谢您,如果不确定/错误,我将编辑我的问题。
编辑: https://i.stack.imgur.com/tqhKw.png 您可以看到两个箭头。它们是我的照片。我通过上面的MouseWheelEvent在中心旋转了它们。在正确的位置上有我的运动标签。您可以更改速度(“ Geschwindigkeit”之后的复选框),然后可以在一个区域中向左转(在画布中,-是0°,|是22.5°,||是45°,并且一个区域是69点)或正确并最终移至新位置。
答案 0 :(得分:1)
您应该使用相对于Canvas的坐标来转换Image元素。
将此图片放在画布中
<Canvas x:Name="canvas">
<Image Width="100"
Source="C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"
MouseLeftButtonDown="OnMouseLeftButtonDown"
MouseLeftButtonUp="OnMouseLeftButtonUp"
MouseMove="OnMouseMove"
MouseWheel="OnMouseWheel">
<Image.RenderTransform>
<MatrixTransform />
</Image.RenderTransform>
</Image>
</Canvas>
代码如下所示。
重要的部分是使用e.GetPosition(canvas)
而不是设置子元素的Canvas.Left
,Canvas.Top
和RenderTransformOrigin
属性。所有转换都是通过RenderTransform
中的单个矩阵完成的。
private Point? mousePos;
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
((IInputElement)sender).CaptureMouse();
mousePos = e.GetPosition(canvas);
}
private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
((IInputElement)sender).ReleaseMouseCapture();
mousePos = null;
}
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (mousePos.HasValue)
{
var element = (UIElement)sender;
var transform = (MatrixTransform)element.RenderTransform;
var matrix = transform.Matrix;
var pos = e.GetPosition(canvas);
matrix.Translate(pos.X - mousePos.Value.X, pos.Y - mousePos.Value.Y);
transform.Matrix = matrix;
mousePos = pos;
}
}
private void OnMouseWheel(object sender, MouseWheelEventArgs e)
{
var element = (UIElement)sender;
var transform = (MatrixTransform)element.RenderTransform;
var matrix = transform.Matrix;
var pos = e.GetPosition(canvas);
matrix.RotateAt(e.Delta > 0 ? 22.5 : -22.5, pos.X, pos.Y);
transform.Matrix = matrix;
}