即使设置了Effects = DragDropEffects.None,为什么还允许drop?

时间:2009-12-11 13:48:53

标签: c# wpf drag-and-drop

拖动从“源”发生到“目标”。当源调用带有allowedEffects的DoDragDrop()作为DragDropEffects.Copy时,我可以通过在目标上设置Effects = DragDropEffects.None来取消放置(在DragOver事件中)。

但是当我将allowedEffects设置为DragDropEffects.Move时,同样的情况也失败了。

要重现这种情况,请从http://jaimersamples.members.winisp.net/samples/dragdrop/drag.zip

下载示例

更改行..(到DragDropEffects.Move)

DragDrop.DoDragDrop(this.DragSource, data, DragDropEffects.Copy);

添加行..

void Window1_DragOver(object sender, DragEventArgs args)
{
   args.Effects = DragDropEffects.None;

并注释掉整个DragSource_GiveFeedback ..

void DragSource_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
    //System.Diagnostics.Debug.WriteLine("DragSource_GiveFeedback " + e.Effects.ToString());

框架中是否存在某种错误,或者我只是看不到明显的错误?

2 个答案:

答案 0 :(得分:56)

在重新审核您的评论和代码之后,通过一些努力,我能够理解并重现您正在讨论的问题。

你缺少的是这一行:

e.Handled = true;

Window1_DragOver活动中。添加它,它对DragDropEffects.MoveDragDropEffects.Copy都有效。

为什么它在DragDropEffects.Copy没有设置e.Handled的情况下适用于任何人的猜测。无证的条件导致无证行为。

我强烈建议您下次发布包含最小可能代码的代码示例以重现问题。我为最初的混淆道歉,但是很难弄清楚这个中发生了什么。

答案 1 :(得分:1)

我认为这个问题已在上面得到了回答,但我只是认为这是我在拖拉时学到的宝贵经验......

传递给DoDragDrop方法的初始DragDropEffect应被视为应执行操作的建议(或期望)。如果我没记错的话,那个方法会返回目标在拖放实际成功(而不是取消)时执行的实际效果。

这在源和目标之间创建了一个简单的通信协议,主要用于存在多个潜在拖动目标的情况。它允许您区分实际发生的事情。这一点特别有用,因为您可能正在与一个您甚至不了解或期望的组件进行交互。如果你考虑到这一点,你有时可以获得令人惊讶的好处,因为拖放变得更有用,因为突然其他组件可以在没有任何其他显式编码的情况下进行互操作。

有了这个说法,我认为.net框架默认不同地处理复制和移动操作是有道理的,因为一个操作是建设性的而另一个是破坏性的。我认为他们正在努力防止不必要的破坏性操作在没有明确处理的情况下发生。不确定这只是一个想法:)