C# 拖动移动网格不向上移动
我试图用一种行为来拖拽画布,我让它做水平运动,但我不能让它做垂直运动。当我尝试垂直拖动它时,当我向上移动鼠标时,它会向上跳,当我向下移动鼠标时,它也会向上跳。它以很大的增量向上移动。虽然水平运动效果很好,但代码也是一样的 下面是我的行为代码C# 拖动移动网格不向上移动,c#,.net,wpf,C#,.net,Wpf,我试图用一种行为来拖拽画布,我让它做水平运动,但我不能让它做垂直运动。当我尝试垂直拖动它时,当我向上移动鼠标时,它会向上跳,当我向下移动鼠标时,它也会向上跳。它以很大的增量向上移动。虽然水平运动效果很好,但代码也是一样的 下面是我的行为代码 public class MouseDragPopupBehavior : Behavior<Grid> { private bool _mouseDown; private Point _oldMousePosition;
public class MouseDragPopupBehavior : Behavior<Grid>
{
private bool _mouseDown;
private Point _oldMousePosition;
/// <summary>
/// Called after the behavior is attached to an AssociatedObject.
/// </summary>
/// <remarks>
/// Override this to hook up functionality to the AssociatedObject.
/// </remarks>
protected override void OnAttached()
{
AssociatedObject.MouseLeftButtonDown += (sender, e) =>
{
_mouseDown = true;
_oldMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
AssociatedObject.CaptureMouse();
};
AssociatedObject.MouseMove += (sender, e) =>
{
if (!_mouseDown) return;
Point newMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
Vector offset = newMousePosition - _oldMousePosition;
_oldMousePosition = newMousePosition;
double horizontalMovement = Canvas.GetLeft(AssociatedObject) + offset.X;
double verticalMovement = Canvas.GetTop(AssociatedObject) + offset.Y;
// Works
//double marginShift = AssociatedObject.Margin.Top + offset.Y;
//AssociatedObject.Margin = new Thickness(0, marginShift, 0, 0);
Canvas.SetLeft(AssociatedObject, horizontalMovement);
// Does not work
Canvas.SetTop(AssociatedObject, verticalMovement);
};
AssociatedObject.MouseLeftButtonUp += (sender, e) =>
{
_mouseDown = false;
AssociatedObject.ReleaseMouseCapture();
};
}
}
public类mousedragpopubbehavior:行为
{
私人住宅区;
私用点(鼠标位置);;
///
///在行为附加到关联对象后调用。
///
///
///重写此项以将功能连接到AssociatedObject。
///
受保护的覆盖无效附加()
{
AssociatedObject.MouseLeftButtonDown+=(发件人,e)=>
{
_mouseDown=true;
_oldMousePosition=AssociatedObject.PointToScreen(例如GetPosition(AssociatedObject));
AssociatedObject.CaptureMouse();
};
AssociatedObject.MouseMove+=(发件人,e)=>
{
如果(!\u mouseDown)返回;
Point newMousePosition=AssociatedObject.PointToScreen(例如GetPosition(AssociatedObject));
矢量偏移=新鼠标位置-_旧鼠标位置;
_oldMousePosition=newMousePosition;
双水平移动=Canvas.GetLeft(关联对象)+offset.X;
双垂直运动=Canvas.GetTop(关联对象)+offset.Y;
//工作
//double marginShift=Associated Object.Margin.Top+offset.Y;
//关联对象。边距=新厚度(0,边距偏移,0,0);
Canvas.SetLeft(关联对象,水平移动);
//不起作用
Canvas.SetTop(关联对象,垂直移动);
};
AssociatedObject.MouseLeftButtonUp+=(发件人,e)=>
{
_mouseDown=false;
AssociatedObject.ReleaseMouseCapture();
};
}
}
我的代码适用于水平(从左到右)移动,但不适用于垂直移动。我确实通过设置边距来实现垂直移动,正如你在注释掉的部分所看到的,但我真的希望它以另一种方式工作
感谢您的帮助。似乎可以节省时间和麻烦,而不是重新发明轮子?我很难让MouseDragElementBehavior为我工作。它确实允许我在屏幕上拖动控件,但是当控件从视图中隐藏,然后再次显示时,我以前的代码会将其放置在鼠标单击位置,但通过此行为,它会将控件放置在鼠标单击位置+与可见性更改时的差异。这就是为什么我希望让我的黑客工作。