发起者如何确定阻力已经结束

本文关键字:结束 何确定 发起者 | 更新日期: 2023-09-27 18:15:56

假设如下情况:控件(例如按钮)有一个附加的行为来启用拖放操作

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

和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;
    }       
}

现在的任务是确定何时拖动结束,以恢复按钮的原始背景。这是没有问题的,当投掷在一个下降目标。但是我如何识别一个不是目标的物体上的水滴呢?在最坏的情况下:在窗外?

发起者如何确定阻力已经结束

DragDrop.DoDragDrop在拖放操作完成后返回
是的,"发起一个拖放操作"是令人困惑的,因为它可以读作"开始拖放并返回":

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
        }
    }
}