WPF拖放控件游标转义该控件
本文关键字:控件 转义 游标 WPF 拖放 | 更新日期: 2023-09-27 18:04:45
我已经创建了自己的可拖动控件。拖动非常简单:
bool moving = false; Point click = new Point(0, 0);
private void _MouseDown(object sender, MouseButtonEventArgs e)
{
moving = true;
click = Mouse.GetPosition(this);
}
private void _MouseUp(object sender, MouseButtonEventArgs e) { moving = false; }
private void _MouseMove(object sender, MouseEventArgs e)
{
if (moving == true)
{
Point po = Mouse.GetPosition(this);
this.Margin = new Thickness(this.Margin.Left + (po.X - click.X), this.Margin.Top + (po.Y - click.Y), 0, 0);
}
}
我的问题是,如果我拖得太快,光标"逃避"我的控制。这是显而易见的原因,然而,它不是太明显如何解决这个问题,因为我不能很容易地订阅每个其他控件的鼠标移动在窗口中,我的控件很小(约35,15像素),所以这发生了很多。我认为,如果我可以轻松地迫使鼠标光标停留在控件中,这将是一个解决方案(虽然不是理想的)。那么最后的解决办法是什么呢?专业控制如何处理这个问题?
注:我正在学习WPF,所以我可能做错了一些事情
您的光标在快速移动时离开用户控件,并且不再触发MouseMove事件。
正如作者在《拖放用户控件》中的评论所说,使用周围画布的MouseMove事件应该会有所帮助。
我明白了,很简单,用一个计时器。
bool moving = false; Point click = new Point(0, 0);
System.Timers.Timer _MOVER = new System.Timers.Timer();
public PersonControl()
{
InitializeComponent();
_MOVER.Elapsed += new System.Timers.ElapsedEventHandler((o, v) => { Dispatcher.Invoke(Move); });
_MOVER.Enabled = true;
_MOVER.Interval = 10;
}
private void _MouseDown(object sender, MouseButtonEventArgs e)
{
moving = true;
click = Mouse.GetPosition(this);
Canvas.SetZIndex(this, 100);
_MOVER.Start();
}
private void _MouseUp(object sender, MouseButtonEventArgs e)
{
moving = false;
Canvas.SetZIndex(this, 0);
_MOVER.Stop();
}
private void Move()
{
if (moving == true)
{
Point po = Mouse.GetPosition(this);
this.Margin = new Thickness(this.Margin.Left + (po.X - click.X), this.Margin.Top + (po.Y - click.Y), 0, 0);
}
}