Wpf 使对象在鼠标向下移动时跟随鼠标;棍子;关于鼠标

Wpf 使对象在鼠标向下移动时跟随鼠标;棍子;关于鼠标,wpf,vb.net,cursor-position,onmousedown,onmouseup,Wpf,Vb.net,Cursor Position,Onmousedown,Onmouseup,我正在处理一个WPF和VB.net项目。我想直观地模拟“拖动”对象(尽管出于目的我不想使用标准拖放) 基本上,我有一个label对象,在MouseDown事件中,我希望它在640x480实体大小的网格内跟随鼠标光标(但不要在网格外!)。请注意,此网格位于全屏窗口的中心。同样,对象不应该跟随网格外的鼠标(我猜这里是“cliptobunds=True”) 然后,在标签的MouseUp事件中,我希望它要么保持在当前位置,要么返回到原始位置,这是由另一个对象的MouseEnter属性设置的布尔变量值决定

我正在处理一个WPF和VB.net项目。我想直观地模拟“拖动”对象(尽管出于目的我不想使用标准拖放)

基本上,我有一个label对象,在MouseDown事件中,我希望它在640x480实体大小的网格内跟随鼠标光标(但不要在网格外!)。请注意,此网格位于全屏窗口的中心。同样,对象不应该跟随网格外的鼠标(我猜这里是“cliptobunds=True”)

然后,在标签的MouseUp事件中,我希望它要么保持在当前位置,要么返回到原始位置,这是由另一个对象的MouseEnter属性设置的布尔变量值决定的

注意,如果更容易使用,我可以立即将网格更改为画布。我想那是可取的

因此,在冗长的解释之后,我的问题是(双重的):

  • 如何使对象(标签)在网格/画布内部跟随鼠标光标,而不是在其外部?这需要在标签的MouseDown事件上发生

  • 如何使对象“粘住”在其当前位置?(从这一点上,我可能可以想出如何让它自己回到原来的位置。:D)


  • 我向任何能帮助我最有效地实现这一目标的人致敬!非常感谢大家。

    像这样的东西怎么样:

    XAML:

    
    
    代码隐藏:

    private bool istragging;
    私有无效矩形_MouseDown(对象发送器,System.Windows.Input.MouseButtonEventArgs e)
    {
    记录CaptureMouse();
    IsDraging=true;
    }
    私有无效矩形\u MouseMove(对象发送方,System.Windows.Input.MouseEventArgs e)
    {
    if(ISDRAGING)
    {
    点canvPosToWindow=canv.TransformToAncestor(this.Transform)(新点(0,0));
    矩形r=发送方为矩形;
    var上限=canvPosToWindow.Y+(r.Height/2);
    var lowerlimit=CANVPostWindow.Y+canv.ActualHeight-(r.Height/2);
    var leftlimit=canvPosToWindow.X+(r.Width/2);
    var rightlimit=CANVPostWindow.X+canv.ActualWidth-(r.Width/2);
    var absmouseXpos=e.GetPosition(this).X;
    var absmouseYpos=e.GetPosition(this).Y;
    if((absmouseXpos>leftlimit&&absmouseXpos上限和&absmouseYpos

    这段代码可以增强,但我认为您已经想到了;)

    基于@Bruno,这是我的解决方案:

    double-maxX;
    双maxY;
    私有void OnRectMouseDown(对象发送器,MouseButtonEventArgs e)
    {
    maxX=canv.ActualWidth-矩形宽度;
    maxY=canv.实际高度-垂直高度;
    rect.CaptureMouse();
    rect.MouseMove+=OnRectMouseMove;
    rect.MouseUp+=OnRectMouseUp;
    }
    私有void OnRectMouseMove(对象发送方,MouseEventArgs e)
    {
    var pos=e.GetPosition(canv);
    var newX=位置X-(矩形宽度/2);
    var newY=位置Y-(垂直高度/2);
    如果(newX<0)newX=0;
    如果(newX>maxX)newX=maxX;
    如果(newY<0)newY=0;
    如果(newY>maxY)newY=maxY;
    rect.SetValue(Canvas.LeftProperty,newX);
    rect.SetValue(Canvas.TopProperty,newY);
    xVal.Content=(newX/maxX.ToString(“F3”);
    yVal.Content=(newY/maxY).ToString(“F3”);
    }
    私有void OnRectMouseUp(对象发送器,MouseButtonEventArgs e)
    {
    rect.ReleaseMouseCapture();
    rect.MouseMove-=OnRectMouseMove;
    rect.MouseUp-=OnRectMouseUp;
    }
    
    试试这个:

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    {
        (name).Location = new Point(e.X,e.Y);
    }
    

    因此,如果您单击该对象,该对象将出现在那里

    AWESOME!!!!!!!请注意,任何使用此功能的人……请确保您在画布上拖动的对象未设置边距属性!否则,您将有一个相当大的偏移量:3设置画布或移动对象的边距没有问题,在计算colision值时只需考虑边距;)如果在网格更改为画布之前,这些边距用于在网格中定位,那么在拖动时,这些边距也会偏离鼠标位于对象上方的点。据我所知,定位边距值在画布上没有任何作用,因此最好将其设置为“0”。