为啥即使设置了 Effects = DragDropEffects.None 也允许放置?

Posted

技术标签:

【中文标题】为啥即使设置了 Effects = DragDropEffects.None 也允许放置?【英文标题】:Why is drop allowed even if Effects = DragDropEffects.None is set?为什么即使设置了 Effects = DragDropEffects.None 也允许放置? 【发布时间】:2010-12-25 16:22:16 【问题描述】:

从“源”拖动到“目标”。当源调用 DoDragDrop() 并将 allowedEffects 作为 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());

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

【问题讨论】:

我在重现您的示例问题时遇到了问题。未经修改,示例不允许我将红色框放入目标画布中。此外,DragDropEffects.* 的所有实例都已设置为 .Move,因此我不确定需要更改哪一行代码。对于它的价值,我将它们全部更改为 DragDropEffects.Copy,但我仍然无法将项目拖放到目标画布中。 我无法截取屏幕截图来显示我想要的预期效果。屏幕截图中不包含鼠标光标,但我会改写我的问题。该示例没有实现红框的放置,它只是开始拖动。我想要的是鼠标光标始终指示是否允许放置。当我使用 DragDropEffects.Copy 调用 DoDragDrop() 并在 Window1_DragOver 中设置 args.Effects = DragDropEffects.None 时,它​​正在工作。但是当我用 DragDropEffects.Move 调用 DoDragDrop() 时它不起作用。 反馈时不应该设置效果吗? 框架不会根据拖动源设置的AllowedEffects和放置目标设置的Effects自动改变鼠标光标吗?据我所知,如果 Effects 与 AllowedEffects 不兼容,鼠标光标会自动切换到“十字符号”。 @Trainee4Life 链接好像失效了 【参考方案1】:

再次检查您的 cmets 和代码后,经过一番努力,我能够理解并重现您所说的问题。

你缺少的是这条线:

e.Handled = true;

在您的Window1_DragOver 活动中。添加它,DragDropEffects.MoveDragDropEffects.Copy 的工作原理相同。

为什么它适用于DragDropEffects.Copy 而没有首先设置e.Handled 是任何人的猜测。无证条件会导致无证行为。

我强烈建议您下次发布包含最少可能代码的代码示例以重现该问题。对于最初的混乱,我深表歉意,但仍然很难弄清楚这是怎么回事。

【讨论】:

1.谈到整个窗口的拖动范围,如果鼠标将其拖出窗口,它只是一个取消拖动的检查。 2. 我的问题特别指出必须将整个 GiveFeedback 注释掉。 3.我明白是drop target指定是否接受数据。放置目标使用其 DragOver 事件通过设置 args.Effects = DragDropEffects.None 来指定是否接受放置。如果是这种情况,它还可以设置复制或移动效果。 4. DragSource 仍然可以在 DragDrop.DoDragDrop() 调用中指定允许的效果。 5.该代码未在生产中使用。这是我在应用程序中创建拖放框架时研究的示例之一。 请再读一遍这个问题,如果你能复制我所说的,那么你会更容易回答。 抱歉,回复晚了,我确实阅读了您的答案,但没有时间检查。无论如何,我认为它应该可以解决问题。我会在我尝试时告诉你。并感谢您抽出宝贵的时间.. :)【参考方案2】:

我认为上面的问题已经得到了很好的回答,但我只是认为这是我在拖放时学到的宝贵一课......

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

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

话虽如此,我想 .net 框架默认以不同方式处理复制和移动操作是有意义的,因为一个操作是建设性的,另一个是破坏性的。我认为他们正试图防止在没有明确处理的情况下发生不需要的破坏性操作。不确定这一点,只是一个想法:)

【讨论】:

以上是关于为啥即使设置了 Effects = DragDropEffects.None 也允许放置?的主要内容,如果未能解决你的问题,请参考以下文章

我没有设置 CORS 标头,即使它已设置。为啥?

为啥即使我设置了 DataTypeReplacement = 'CBuiltIn',MATLAB Coder 也不会生成 C 内置类型?

为啥即使我在项目设置中更改了语言标准,std::lcm() 也不起作用?

为啥即使配置文件设置为分发,xcode 也会抛出此错误?

为啥即使我设置了 STATIC_ROOT 和 urls.py 也会出现 404 错误

为啥即使 objectEquality 设置为 true,$watch 也不会触发?