wpf圆跟随鼠标旋转问题求解

runerback 2016-09-30 02:39:21
基本实现了,目前遇到点问题解决不了,谷歌也没搜到类似的。
首先界面上有个圆,然后鼠标按下拖拽的时候圆就跟着鼠标转动
代码我截图贴上来吧
界面上:
初始化的时候设置旋转参数:

然后一个存储鼠标按下时圆心到该点的向量,一个记录鼠标是否按下:

鼠标按下记录向量:

最后在鼠标移动的事件里处理需要旋转到的角度:


这样基本可以了,但是我遇到的问题是,当鼠标移动一下然后停在那个位置,圆盘上次旋转完又触发了鼠标移动事件,然后圆盘就要回到上次的位置,然后圆盘转回去之后同样再次触发鼠标移动事件,这样就导致虽然鼠标"不动"了,但是圆盘却还在不停"抖动",鼠标停的位置离圆心越近则"抖动"的幅度越大。后面我想到也许注册外层的UserControl的鼠标移动事件能避免这个问题,结果还是不行。
如果没说明白我过会录个gif传上来
...全文
325 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
karl_xy 2016-12-07
  • 打赏
  • 举报
回复
看起来好帅气啊 有没有源码啊
runerback 2016-10-28
  • 打赏
  • 举报
回复
引用 3 楼 nonocast 的回复:
没玩过矢量,不会……
nonocast 2016-10-04
  • 打赏
  • 举报
回复
我感觉你在处理drag的方式不太好,应该在down的时候capture住,然后在move判断isCapture,然后计算offset改变angle angle做成依赖属性直接绑定了到transform上。 另外抖动和你的图片会有很大的关系,建议直接上矢量。
runerback 2016-09-30
  • 打赏
  • 举报
回复
代码改成这样就好多了,但是鼠标移动的过程中也会出现"抖动"。

        private void TurnTable_MouseMove(object sender, MouseEventArgs e)
        {
            try
            {
                if (this.m_isMouseDown)
                {
                    Point pos = e.GetPosition(this);
                    if (pos != this.m_lastPos)
                    {
                        this.m_lastPos = pos;
                        this.Dispatcher.BeginInvoke((Action<Point>)this.onMouseMoving, e.GetPosition(this.table));
                    }
                }
            }
            catch
            {
                throw;
            }
        }
除了在鼠标移动事件里处理也想不出别的什么方法
runerback 2016-09-30
  • 打赏
  • 举报
回复
实际效果:


110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧