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

Tra*_*ife 22 c# wpf drag-and-drop

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

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

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

更改行..(到DragDropEffects.Move)

DragDrop.DoDragDrop(this.DragSource, data, DragDropEffects.Copy);
Run Code Online (Sandbox Code Playgroud)

添加行..

void Window1_DragOver(object sender, DragEventArgs args)
{
   args.Effects = DragDropEffects.None;
Run Code Online (Sandbox Code Playgroud)

并注释掉整个DragSource_GiveFeedback ..

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

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

Aar*_*ght 57

在仔细阅读了您的评论和代码之后,通过一些努力,我能够理解并重现您正在讨论的问题.

您缺少的是这条线:

e.Handled = true;
Run Code Online (Sandbox Code Playgroud)

在你的Window1_DragOver活动中.添加它,它将同时适用于DragDropEffects.MoveDragDropEffects.Copy.

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

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