首页 > 其他分享 >WPF画导航箭头,始终指向鼠标位置

WPF画导航箭头,始终指向鼠标位置

时间:2023-07-27 14:11:48浏览次数:27  
标签:鼠标 atan Point System player 箭头 WPF PI Math

 

界面:

<Canvas x:Name="container">
    <Viewbox x:Name="player" Width="50" Height="50" RenderTransformOrigin="0.5,0.5">
        <Viewbox.RenderTransform>
            <TransformGroup>
                <RotateTransform Angle="0"/>
            </TransformGroup>
        </Viewbox.RenderTransform>
        <Path Fill="DodgerBlue" Data="M0,10 5,0 10,10 5,8" VerticalAlignment="Center" HorizontalAlignment="Center"></Path>
    </Viewbox>
</Canvas>

初始位置在窗口中央:

Point center;
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    Point p = new Point((this.ActualWidth - player.ActualWidth) / 2, (this.ActualHeight - player.ActualHeight) / 2);
    center = new Point(p.X + player.ActualWidth / 2, p.Y + player.ActualHeight / 2);
    Canvas.SetLeft(player, p.X);
    Canvas.SetTop(player, p.Y);
}

获取鼠标坐标,并计算旋转角度:

protected override void OnPreviewMouseMove(MouseEventArgs e)
{
    base.OnPreviewMouseMove(e);
    Point p = e.GetPosition(container);
    Point p1 = new Point(p.X - center.X, p.Y - center.Y);
    SetAngle(p1);
}

void SetAngle(Point o)
{
    var tran = player.RenderTransform.GetTransform<RotateTransform>();
    var atan = System.Math.Atan(o.X / o.Y);
    if (o.X == 0d)
    {
        if (o.Y > 0)
            atan = System.Math.PI;
    }
    else if (o.Y == 0)
    {
        atan = o.X >= 0 ? System.Math.PI / 2 : -System.Math.PI / 2;
    }
    else if (o.X > 0)
    {
        if (o.Y < 0)
            atan = System.Math.Atan(o.X / -o.Y);
        else
            atan = System.Math.PI - System.Math.Atan(o.X / o.Y);
    }
    else
    {
        if (o.Y < 0)
            atan = System.Math.Atan(o.X / -o.Y);
        else
            atan = System.Math.PI + System.Math.Atan(-o.X / o.Y);
    }
    tran!.Angle = Math.RadianToAngle(atan);
}

帮助类:

public static class Math
{
    /// <summary>
    /// 弧度转角度
    /// </summary>
    /// <param name="radian"></param>
    /// <returns></returns>
    public static double RadianToAngle(double radian)
    {
        return 180 / System.Math.PI * radian;
    }

    public static double Length(Point p1, Point p2)
    {
        double x = p1.X - p2.X;
        double y = p1.Y - p2.Y;
        return System.Math.Sqrt(x * x + y * y);
    }
}
public static class WPFExtension
{
    public static T? GetTransform<T>(this Transform transform) where T : Transform
    {
        if (transform == null) return null;
        if(transform is TransformGroup group)
        {
            foreach (var item in group.Children)
            {
                if(item is T) return (T)item;
            }
        }
        return (T)transform;
    }
}

 

标签:鼠标,atan,Point,System,player,箭头,WPF,PI,Math
From: https://www.cnblogs.com/RedSky/p/17584769.html

相关文章

  • WPF学习——开篇
    不知不觉我学习WPF已经两年啦。大部分时间是自娱自乐,只做了一个公司的小项目,有一点不能否认,WPF是我用过的最好的GUI框架。用过WPF之后,Qt,MFC,Duilib什么的碰都不想碰一下,Qt和MFC是差不多档次的大型框架,Duilib是库级别的东西,完全不是一个档次的。当然了,客户端还有新贵electron,但目前......
  • Node.js低代码管理系统:只需点击鼠标,搭建属于你的企业应用
    低代码管理系统是一种通过可视化界面和简化的开发工具,使非专业开发人员能够快速构建和管理应用程序的系统。它提供了一套预先定义的组件和模块,使用户可以通过拖放操作来设计应用程序的界面和逻辑。低代码管理系统还提供了自动化的工作流程、数据管理和集成功能,使用户能够快速创建和......
  • DevExpress WPF Tree List组件,让数据可视化程度更高!(一)
    DevExpressWPFTreeList组件是一个功能齐全、数据感知的TreeView-ListView混合体,可以把数据信息显示为REE、GRID或两者的组合,在数据绑定或非绑定模式下,具有完整的数据编辑支持。DevExpressWPF 拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过......
  • WPF设置字体和字号
    最简单在MainWindow.xaml设置,字体FontFamily,字号FontSize<Windowx:Class="TestWpf.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"......
  • Windows在资源管理器地址栏输入不用鼠标快速启动程序
    Windows用户一般打开东西,都是双击某个图标,还有一种是在命令行启动。但是,还有一个地方可以直接启动,就是我们常用的资源管理器(在桌面上,以前叫我的电脑、计算机)的那个图标里,地址栏就可以直接输入。1.启动:VisualStudioCode(简称vscode)当输入v的时候,系统会自动搜索桌......
  • .net 6 wpf aop
    .NET6中的WPF和AOP在.NET6中,WindowsPresentationFoundation(WPF)已经成为一个非常强大和流行的框架,用于创建富客户端应用程序。同时,面向切面编程(AOP)是一种优秀的编程范式,可以用于实现横切关注点的分离。本文将介绍在.NET6中如何结合使用WPF和AOP,并提供一些......
  • WPF Syncfusion控件(图表部分)简介
    一周之前就打算也这篇文章了,但由于非常忙最近,家里的事情很多。周日晚上忙完所有事情,终于有自己的时间,于是决定完成这篇文章,不能再拖了!本文主要是给读者起到一个知道怎么去阅读demo的作用,如果在实际开发中读者需要使用到syncfusion,务必仔细阅读官方文档中所提供的demo。写之前......
  • 8266sg90舵机+WPF上位机
    上位机可以通过串口控制舵机、蜂鸣器。示例:Esp8266部分基于Arduino,依赖库:U8g2、Servo。接线引脚看代码哈。#include<Arduino.h>#include<Servo.h>#include<U8g2lib.h>/***OLED引脚*/#defineSCL5/*时钟引脚*/#defineSDA4/*数据引脚*/#defineRES14......
  • WPF AsyncLocal 为 null 的错误 、 AsyncLocal 在WPF中的使用问题
    前言:  想载WPF中使用AsyncLocal下,发现这里面有个巨坑。参考链接  标题为AsyncLocalinWPFisnullafterfirstsetonthesamethread  AsyncLocl变量在程序初始化时设置,主窗口加载Load事件之前都还有,Load事件执行完后就,清空了ExecutionContext。示例  ......
  • WPF .net6 自定义启动入口 、 自定义Main函数、自定义 STAThread 方法
    前言:  为了解决程序开启自启动问题参考资料  CustomEntryPointsinWPFon.NETCore链接https://blog.magnusmontin.net/2020/01/31/custom-entry-point-wpf-net-core/  CreatingacustomMainmethodinaWPFapplication链接https://www.meziantou.net/creat......