如何平移和旋转图像
How to translate and rotate an image
我想在 C# 中旋转然后移动图像。图片在 Canvas 中。我的问题是,如果您使用以下
旋转图像
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;
}
或旋转变换
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
您只需旋转 "picture",但不是它的底座。所以如果你想用 Canvas.GetLeft/GetTop 移动图像,它的行为就像它仍然没有旋转一样。因此,如果您设置 Top/Left-corner,旋转图像的实际角不会放置在我想要的位置。
在https://wpf.2000things.com/2013/03/08/772-use-rendertransformorigin-to-change-center-point-for-rotation-transforms/,在图片中你可以看到我的意思。我怎么可能用实际图像旋转 "base" ?我看到它在 WinForms 中是可能的,但是它(如何)在 WPF 中工作?
在此先感谢,如果有任何问题 unclear/wrong 我会编辑我的问题。
编辑:
https://i.stack.imgur.com/tqhKw.png
你可以看到两个箭头。它们是我的形象。我用上面的 MouseWheelEvent 在中心旋转了它们。在正确的网站上有我的运动标签。您可以更改速度("Geschwindigkeit" 后的复选框),然后您可以在一段中左转(其中 - 为 0°,| 为 22.5°,|| 为 45°,一段为 69 点) Canvas) 或向右并最终到达新位置。
您应该使用相对于 Canvas 的坐标来转换图像元素。
在 Canvas
中使用此图片
<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;
}
我想在 C# 中旋转然后移动图像。图片在 Canvas 中。我的问题是,如果您使用以下
旋转图像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;
}
或旋转变换
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
您只需旋转 "picture",但不是它的底座。所以如果你想用 Canvas.GetLeft/GetTop 移动图像,它的行为就像它仍然没有旋转一样。因此,如果您设置 Top/Left-corner,旋转图像的实际角不会放置在我想要的位置。 在https://wpf.2000things.com/2013/03/08/772-use-rendertransformorigin-to-change-center-point-for-rotation-transforms/,在图片中你可以看到我的意思。我怎么可能用实际图像旋转 "base" ?我看到它在 WinForms 中是可能的,但是它(如何)在 WPF 中工作? 在此先感谢,如果有任何问题 unclear/wrong 我会编辑我的问题。
编辑: https://i.stack.imgur.com/tqhKw.png 你可以看到两个箭头。它们是我的形象。我用上面的 MouseWheelEvent 在中心旋转了它们。在正确的网站上有我的运动标签。您可以更改速度("Geschwindigkeit" 后的复选框),然后您可以在一段中左转(其中 - 为 0°,| 为 22.5°,|| 为 45°,一段为 69 点) Canvas) 或向右并最终到达新位置。
您应该使用相对于 Canvas 的坐标来转换图像元素。
在 Canvas
中使用此图片<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;
}