C# 鼠标事件不工作两次

C# 鼠标事件不工作两次,c#,wpf,events,canvas,draggable,C#,Wpf,Events,Canvas,Draggable,我遇到了一个奇怪的问题。我有一张画布,画了一个复杂的结构: 边框内网格内的图像。 我的图像是一个活动的移动 第一次拖动结构时效果很好,但第二次什么都不起作用,也不例外,但什么都不起作用。在我看来,这似乎是一个捕捉老鼠的问题,但我无法捕捉到这是怎么回事 以下是我的活动代码: bool captured = false; double x_shape, x_canvas, y_shape, y_canvas; double x_shape_Origine, y_shape_Origine; Bord

我遇到了一个奇怪的问题。我有一张画布,画了一个复杂的结构: 边框内网格内的图像。 我的图像是一个活动的移动

第一次拖动结构时效果很好,但第二次什么都不起作用,也不例外,但什么都不起作用。在我看来,这似乎是一个捕捉老鼠的问题,但我无法捕捉到这是怎么回事

以下是我的活动代码:

bool captured = false;
double x_shape, x_canvas, y_shape, y_canvas;
double x_shape_Origine, y_shape_Origine;
Border source = null;


int CountZ = 10;

private void shape_MoveButtonDown(object sender, MouseButtonEventArgs e)
{
    /// AWFULLY SOURCE WAS null. I don't understand Why it was working the    
    /// first time
    Mouse.Capture(source);
    captured = true;

    Image myImage = (Image)sender;
    Grid outerGrid = (Grid)myImage.Parent;
    source = (Border)outerGrid.Parent;

    Canvas.SetZIndex(source, CountZ++);
    x_shape = Canvas.GetLeft(source);
    y_shape = Canvas.GetTop(source);

    x_canvas = e.GetPosition(myCanvas).X;
    y_canvas = e.GetPosition(myCanvas).Y;

}


private void shape_MoveMoving(object sender, MouseEventArgs e)
{
    if (captured)
    {
        double x = e.GetPosition(myCanvas).X;
        double y = e.GetPosition(myCanvas).Y;
        x_shape += x - x_canvas;
        Canvas.SetLeft(source, x_shape);
        x_canvas = x;
        y_shape += y - y_canvas;
        Canvas.SetTop(source, y_shape);
        y_canvas = y;
    }
}

private void shape_MoveButtonUp(object sender, MouseButtonEventArgs e)
{
    Mouse.Capture(null);
    captured = false;

}

private void shape_MouseEnter(object sender, MouseEventArgs e)
{
    if (!captured)
    {
        Border inner = (Border)sender;
        Grid parentInner = (Grid)inner.Parent;

        parentInner.Children[0].Visibility = Visibility.Visible;
        parentInner.Children[2].Visibility = Visibility.Visible;
        parentInner.Children[5].Visibility = Visibility.Visible;
        parentInner.Children[6].Visibility = Visibility.Visible;
        parentInner.Children[8].Visibility = Visibility.Visible;

        parentInner.Background = new SolidColorBrush(Colors.Red);
    }
}

private void shape_MouseLeave(object sender, MouseEventArgs e)
{
    if (!captured)
    {
        Grid outer = (Grid)sender;

        outer.Children[0].Visibility = Visibility.Hidden;
        outer.Children[2].Visibility = Visibility.Hidden;
        outer.Children[5].Visibility = Visibility.Hidden;
        outer.Children[6].Visibility = Visibility.Hidden;
        outer.Children[8].Visibility = Visibility.Hidden;

        outer.Background = null;
    }
}

希望它对您有意义

我有一个完整的WPF和Silverlight D&D样品。这里有完整的代码,希望对大家有所帮助

class MyWnd : Window
{       
    public MyWnd()
    {
        var c = new Canvas();
        c.Background = new SolidColorBrush(Colors.White);

        var rect = new Rectangle { Fill = new SolidColorBrush(Colors.Red), Width = 20, Height = 20 };
        c.Children.Add(rect);

        this.Content = c;

        Canvas.SetLeft(rect, 0);
        Canvas.SetTop(rect, 0);

        rect.MouseLeftButtonDown+=Handle_MouseDown;
        rect.MouseLeftButtonUp+=Handle_MouseUp;
        rect.MouseMove+=Handle_MouseMove;
    }


    bool isMouseCaptured;
    double mouseVerticalPosition;
    double mouseHorizontalPosition;

    public void Handle_MouseDown(object sender, MouseEventArgs args)
    {
        var item = sender as FrameworkElement;
        mouseVerticalPosition = args.GetPosition(null).Y;
        mouseHorizontalPosition = args.GetPosition(null).X;
        isMouseCaptured = true;
        item.CaptureMouse();
    }

    public void Handle_MouseMove(object sender, MouseEventArgs args)
    {
        var item = sender as FrameworkElement;
        if (isMouseCaptured)
        {

            // Calculate the current position of the object.
            double deltaV = args.GetPosition(null).Y - mouseVerticalPosition;
            double deltaH = args.GetPosition(null).X - mouseHorizontalPosition;
            double newTop = deltaV + (double)item.GetValue(Canvas.TopProperty);
            double newLeft = deltaH + (double)item.GetValue(Canvas.LeftProperty);

            // Set new position of object.
            item.SetValue(Canvas.TopProperty, newTop);
            item.SetValue(Canvas.LeftProperty, newLeft);

            // Update position global variables.
            mouseVerticalPosition = args.GetPosition(null).Y;
            mouseHorizontalPosition = args.GetPosition(null).X;
        }
    }

    public void Handle_MouseUp(object sender, MouseEventArgs args)
    {
        var item = sender as FrameworkElement;
        isMouseCaptured = false;
        item.ReleaseMouseCapture();
        mouseVerticalPosition = -1;
        mouseHorizontalPosition = -1;
    }
}

void Main()
{
    var wnd = new MyWnd();
    wnd.ShowDialog();
}

我用WPF和Silverlight制作了一个完整的D&D样品。这里有完整的代码,希望对大家有所帮助

class MyWnd : Window
{       
    public MyWnd()
    {
        var c = new Canvas();
        c.Background = new SolidColorBrush(Colors.White);

        var rect = new Rectangle { Fill = new SolidColorBrush(Colors.Red), Width = 20, Height = 20 };
        c.Children.Add(rect);

        this.Content = c;

        Canvas.SetLeft(rect, 0);
        Canvas.SetTop(rect, 0);

        rect.MouseLeftButtonDown+=Handle_MouseDown;
        rect.MouseLeftButtonUp+=Handle_MouseUp;
        rect.MouseMove+=Handle_MouseMove;
    }


    bool isMouseCaptured;
    double mouseVerticalPosition;
    double mouseHorizontalPosition;

    public void Handle_MouseDown(object sender, MouseEventArgs args)
    {
        var item = sender as FrameworkElement;
        mouseVerticalPosition = args.GetPosition(null).Y;
        mouseHorizontalPosition = args.GetPosition(null).X;
        isMouseCaptured = true;
        item.CaptureMouse();
    }

    public void Handle_MouseMove(object sender, MouseEventArgs args)
    {
        var item = sender as FrameworkElement;
        if (isMouseCaptured)
        {

            // Calculate the current position of the object.
            double deltaV = args.GetPosition(null).Y - mouseVerticalPosition;
            double deltaH = args.GetPosition(null).X - mouseHorizontalPosition;
            double newTop = deltaV + (double)item.GetValue(Canvas.TopProperty);
            double newLeft = deltaH + (double)item.GetValue(Canvas.LeftProperty);

            // Set new position of object.
            item.SetValue(Canvas.TopProperty, newTop);
            item.SetValue(Canvas.LeftProperty, newLeft);

            // Update position global variables.
            mouseVerticalPosition = args.GetPosition(null).Y;
            mouseHorizontalPosition = args.GetPosition(null).X;
        }
    }

    public void Handle_MouseUp(object sender, MouseEventArgs args)
    {
        var item = sender as FrameworkElement;
        isMouseCaptured = false;
        item.ReleaseMouseCapture();
        mouseVerticalPosition = -1;
        mouseHorizontalPosition = -1;
    }
}

void Main()
{
    var wnd = new MyWnd();
    wnd.ShowDialog();
}