Перетаскивание в WPF и c#

#c# #wpf #drag-and-drop

#c# #wpf #перетаскивание

Вопрос:

у меня есть три панели, которые содержат три разных пользовательских элемента управления, а именно A, B и C. (примечание: эти пользовательские элементы управления создаются во время выполнения). перетаскивание из A в B и из B в C формирует допустимую строку в моем приложении.

рассмотрим A1, A2, A3 и A4 как экземпляры элемента управления A. и B1, B2, B3 и B4 как экземпляры элемента управления B, а C1 и C2 — как экземпляры элемента управления C.

подумайте, A1 перетаскивается на B1. который затем может быть удален на C1 или C2. я хочу ограничить перетаскивание элемента управления B * (я имею в виду, если я перейду на B1, тогда я смогу перетаскивать только B1, а не другие экземпляры). * в настоящее время я могу перетащить любой экземпляр независимо от drop.

может ли кто-нибудь дать мне какую-нибудь идею для достижения того же?

Комментарии:

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

2. привет, спасибо за ответ, но у меня все равно это не сработало: (я все еще мог перетащить элемент управления другим элементом управления.

3. КОНЕЧНО. код выглядит примерно так:

4. КОНЕЧНО. код выглядит примерно так: удаление элемента управления B также помогает мне получить A. аннулировать B_Drop(отправитель объекта, DragEventArgs e) { A usrA = e.Data.getData(typeof(A)) как A; B usrB = e.Source как B; //определить отброшенный (в настоящее время использующий строку) элемент управления strCurrentConverter = usrB.Name ; } после перетаскивания B пустотаB_PreviewMouseLeftButtonUp(отправитель объекта, система. Windows. Ввод. MouseButtonEventArgs e){ B cntB = отправитель как B;} попытка получить отправителя в данный момент времени переопределяет строку, которую я использую для идентификации элемента управления при удалении

Ответ №1:

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

Ответ №2:

Добавьте свойство к вашему элементу управления типа «B», которое указывает, что оно доступно для будущих операций перетаскивания.

 private bool IsActiveDragSource { get; set; }
 

Добавьте обработчик к событию «Drop» вашего элемента управления типа «B», который устанавливает для свойства «IsActiveDragSource» значение true

 private void label_Drop(object sender, DragEventArgs e)
{
     // Handle the drop from control A
     this.IsActiveDragSource = true;
}
 

В вашем MouseMove (или любом другом событии перетаскивания, которое вы выбрали) создавайте экземпляр операции DoDragDrop только в том случае, если для вашего нового свойства установлено значение true.

     private void control_MouseMove(object sender, MouseEventArgs e)
    {
        if (this.IsActiveDragSource)
        {
            // Initialize the drag drop operation
            DragDrop.DoDragDrop(this, this, DragDropEffects.Copy);
        }
    }