Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拖动移动网格不向上移动_C#_.net_Wpf - Fatal编程技术网

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为我工作。它确实允许我在屏幕上拖动控件,但是当控件从视图中隐藏,然后再次显示时,我以前的代码会将其放置在鼠标单击位置,但通过此行为,它会将控件放置在鼠标单击位置+与可见性更改时的差异。这就是为什么我希望让我的黑客工作。