旋转图像以跟随鼠标位置 - WPF C#

时间:2016-01-31 22:36:26

标签: c# wpf

我正在尝试使图像旋转以跟随鼠标位置,就像小行星的船只一样,但要用鼠标位置而不是箭头键进行控制......帮助会有所帮助!

3 个答案:

答案 0 :(得分:1)

首先,您需要知道图像的位置。然后,您可以通过MouseMove事件找到光标位置。每次鼠标移动时都会调用此事件。您可以使用GetPosition方法查找Point以获取XY坐标。

 private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        Point point = e.GetPosition(null);           
    }

现在您已获得XY坐标,您可以使用Pythagorean Theorem查找图片与光标所在位置之间的距离。现在找到角度,AngleOfImage = sin^-1(Y/total distance between your image and cursor)找到角度。

如果您希望图像在渲染后移动,则需要使用RenderTransform属性。由于您需要旋转图像,因此可以使用RotateTransform类来完成此操作。由于您已计算角度并将其设置为等于属性AngleOfImage,因此您可以将该属性绑定到Angle的{​​{1}}依赖项属性,因此您的xaml看起来像这样。< / p>

RotateTransform

用于计算角度的<Image> <Image.RenderTransform> <RotateTransform Angle="{Binding AngleOfImage}"/> </Image.RenderTransform> </Image> 事件的实际工作代码

MouseMove

其中private void Window_MouseMove(object sender, MouseEventArgs e) { var somePoint = e.GetPosition(mainWindow); X = somePoint.X; Y = somePoint.Y; var newX = Abs(X - RectangleOriginX); var newY = Abs(Y - RectangleOriginY); var powX = Pow(newX, 2); var powY = Pow(newY, 2); var distance = Sqrt(powX + powY); var result = newX / distance; Angle = Asin(result).ToDegrees(); } 只是将值转换为度数的扩展方法。 ToDegrees()RectangleOriginX是我控制的点,我从这里得到了

RectangleOriginY

我的工作 private void mainWindow_Loaded(object sender, RoutedEventArgs e) { var origialPoint = rect.TransformToAncestor(mainWindow).Transform(new Point(0, 0)); RectangleOriginX = origialPoint.X; RectangleOriginY = origialPoint.Y; }

xaml

答案 1 :(得分:-1)

抱歉我的英文不好

尝试使用System.Windows.Forms.Timer,并在Timer_tick事件中调用一些Move(MouseEventArgs e)

像这样的东西

private void Move(MouseEventArgs e)
    {
     if(mainwindow has focus)
     {
       your_image.Position = NextPosition(e);
     }
    }

MouseEventArgs的实例是您的类的字段,它在MouseMove事件中更改。

在NextPosition中,您可以使用任何pathfind算法

答案 2 :(得分:-1)

如果我能理解你的话

你可以通过一些数学来实现它

  • 首先获得中心点
  • 获取鼠标位置
  • 使用Math.ASin()获取角度
  • 就像Math.ASin(x / d);
  • 一样

x将是鼠标位置 - 图像中心位置

d将是图像中心与鼠标位置之间的距离,您可以通过Pythagorean theorem

获取它

然后使用计时器来实现这一目标。

我希望我的回答能帮到你。