Почему отбрасывание позволяется даже если Эффекты = DragDropEffects. Ни один не установлен?

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

Но та же ситуация перестала работать, когда я установил свой allowedEffects как DragDropEffects. Переместиться.

Для репродуцирования ситуации загрузите образец с http://jaimersamples.members.winisp.net/samples/dragdrop/drag.zip

Строка изменения.. (к DragDropEffects. Переместитесь),

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());

Есть ли в платформе некоторая ошибка, или разве я просто не в состоянии видеть что-то очевидное?

22
задан Trainee4Life 11 December 2009 в 18:40
поделиться

2 ответа

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

Что вам не хватает, так это строки:

e.Handled = true;

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

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

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

57
ответ дан 29 November 2019 в 03:55
поделиться

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

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

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

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

1
ответ дан 29 November 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: