Wpf 使对象在鼠标向下移动时跟随鼠标;棍子;关于鼠标
我正在处理一个WPF和VB.net项目。我想直观地模拟“拖动”对象(尽管出于目的我不想使用标准拖放) 基本上,我有一个label对象,在MouseDown事件中,我希望它在640x480实体大小的网格内跟随鼠标光标(但不要在网格外!)。请注意,此网格位于全屏窗口的中心。同样,对象不应该跟随网格外的鼠标(我猜这里是“cliptobunds=True”) 然后,在标签的MouseUp事件中,我希望它要么保持在当前位置,要么返回到原始位置,这是由另一个对象的MouseEnter属性设置的布尔变量值决定的 注意,如果更容易使用,我可以立即将网格更改为画布。我想那是可取的 因此,在冗长的解释之后,我的问题是(双重的):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属性设置的布尔变量值决定
我向任何能帮助我最有效地实现这一目标的人致敬!非常感谢大家。像这样的东西怎么样: 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”。