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,所以我可能做错了一些事情

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);
    }
}