xelor
xelor

Reputation: 319

How can the initiator determine that the drag has ended?

Let's assume the following Situation: a Control (e.g. a Button) has an attached behavior to enable a Drag&Drop-Operation

<Button Content="test"> 
    <i:Interaction.Behaviors>
        <SimpleDragBehavior/>
    </i:Interaction.Behaviors>
</Button>

And the SimpleDragBehavior

public class SimpleDragBehavior: Behavior<Button>
{       
    protected override void OnAttached ()
    {           
        AssociatedObject.MouseLeftButtonDown += OnAssociatedObjectMouseLeftButtonDown;
        AssociatedObject.MouseLeftButtonUp   += OnAssociatedObjectMouseLeftButtonUp;
        AssociatedObject.MouseMove           += OnAssociatedObjectMouseMove;

        mouseIsDown = false;
    }       

    private bool  mouseIsDown;

    private void OnAssociatedObjectMouseMove (object sender, MouseEventArgs e)
    {
        if (mouseIsDown)
        {
            AssociatedObject.Background = new SolidColorBrush(Colors.Red);

            DragDrop.DoDragDrop((DependencyObject)sender,
                                AssociatedObject.Content,
                                DragDropEffects.Link);
        }
    }

    private void OnAssociatedObjectMouseLeftButtonUp (object sender, MouseButtonEventArgs e)
    {
        mouseIsDown = false;
    }

    private void OnAssociatedObjectMouseLeftButtonDown (object sender, MouseButtonEventArgs e)
    {
        mouseIsDown = true;
    }       
}

The task now is to determine when the drag ends, to restore the orignal backgound of the button. This is no problem when droped on an drop-target. But how do i recognize a drop on something which isn't a drop-target? In the worst case: outside the window?

Upvotes: 4

Views: 70

Answers (1)

Dennis
Dennis

Reputation: 37770

DragDrop.DoDragDrop returns after drag-and-drop operation is completed.
Yes, "Initiates a drag-and-drop operation" is confusing, since it could be read as "start drag-and-drop and return":

private void OnAssociatedObjectMouseMove (object sender, MouseEventArgs e)
{
    if (mouseIsDown)
    {
        AssociatedObject.Background = new SolidColorBrush(Colors.Red);

        var effects = DragDrop.DoDragDrop((DependencyObject)sender,
                            AssociatedObject.Content,
                            DragDropEffects.Link);

        // this line will be executed, when drag/drop will complete:
        AssociatedObject.Background = //restore color here;

        if (effects == DragDropEffects.None)
        {
            // nothing was dragged
        }
        else
        {
            // inspect operation result here
        }
    }
}

Upvotes: 1

Related Questions