Подтвердить что ты не робот

Почему допускается падение, даже если Effects = DragDropEffects.None установлен?

Перетаскивание происходит из "источника" в "цель". Когда источник вызывает DoDragDrop() с allowedEffects как DragDropEffects.Copy, тогда я могу отменить падение, установив Effects = DragDropEffects.None на цель (в событии DragOver).

Но такая же ситуация не срабатывает, когда я устанавливаю разрешенные эффекты как 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());

Есть ли какая-то ошибка в структуре, или я просто не вижу ничего очевидного?

4b9b3361

Ответ 1

После повторного просмотра ваших комментариев и вашего кода, с некоторыми усилиями я смог понять и воспроизвести проблему, о которой вы говорите.

То, что вам не хватает, это строка:

e.Handled = true;

В вашем событии Window1_DragOver. Добавьте это, и он будет работать одинаково для DragDropEffects.Move и DragDropEffects.Copy.

Почему он работал для DragDropEffects.Copy без установки e.Handled, в первую очередь, кто-то догадывается. Недокументированные условия приводят к недокументированному поведению.

Я очень рекомендую, чтобы в следующий раз вы отправили образец кода, содержащий минимально возможный код для воспроизведения проблемы. Я извиняюсь за оригинальное замешательство, но, тем не менее, было очень сложно понять, что происходит в этом.

Ответ 2

Я думаю, что на вопрос ответили намного выше, но я просто подумал, что это был ценный урок, который я узнал, когда делаю перетаскивание...

Исходный DragDropEffect, который передается методу DoDragDrop, следует рассматривать как предложение (или желание) для какой операции необходимо выполнить. Если я правильно помню, этот метод возвращает фактический эффект выполнения цели, если перетаскивание действительно было успешным (и не отменено).

Это создает простой протокол связи между источником и получателем и в основном полезен для случаев, когда существует несколько потенциальных целей для перетаскивания. Это позволяет вам отличить то, что на самом деле произошло. Это особенно полезно, потому что вы можете взаимодействовать с компонентом, о котором вы даже не знаете или не ожидаете. Если учесть это, вы иногда можете получить удивительные преимущества, когда перетаскивание становится более полезным, изначально планировалось, потому что внезапно другие компоненты могут взаимодействовать без какого-либо другого явного кодирования.

С учетом сказанного, я бы предположил, что для .NET Framework имеет смысл рассматривать операции копирования и перемещения по-разному по умолчанию, поскольку одна операция является конструктивной, а другая - разрушительной. Я думаю, что они пытаются защитить от нежелательных деструктивных операций от происходящего, не будучи явно обработанными. Не уверен в этом, а просто подумал:)