WPF拖拽控制光标转义控件

时间:2015-07-26 01:53:41

标签: c# wpf

我已经创建了自己的可拖动控件。拖动非常简单:

    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像素),所以这种情况发生了很多。我认为,如果我可以轻松地强制鼠标光标留在控件中,这将是一个解决方案(虽然不理想)。 那么解决这个问题的麻烦方法是什么?专业控制如何处理这个?

P.S。我正在学习WPF,所以我可能做错了什么

2 个答案:

答案 0 :(得分:0)

您的光标会在快速移动时离开用户控件,并且不再触发MouseMove事件。

正如作者在Drag Drop UserControls中使用周围Canvas的MouseMove事件所做的评论所说的应该有所帮助。

答案 1 :(得分:0)

我已经弄明白了,使用计时器非常简单。

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