Перетаскивание из ListBoxDragDropTarget в PanelDragDropTarget - PullRequest
1 голос
/ 22 сентября 2010

С помощью инструментария Silverlight 4 можно ли перетаскивать объекты из ListBox в Canvas (и получать событие при перетаскивании в Canvas)?перетащите из панели переноса внутри PanelDragDropTarget на холст, но обработчик события не сработал, когда произошло удаление.Когда я попытался перетащить из списка ListBox внутри ListBoxDragDrop на холст внутри PanelDragDropTarget, падение не произошло (и обработчик событий не сработал).При перетаскивании по холсту курсор превращался в курсор со стрелками вверх / вниз.

Спасибо, Тед

Ответы [ 3 ]

2 голосов
/ 16 июля 2011

После шага, описанного в посте Мохамеда, все еще есть небольшая проблема. Когда вы наводите курсор на целевой элемент Panel, индикатор перетаскивания выглядит как индикатор для операции прокрутки (а мне нужен индикатор со стрелкой - для операции перемещения). Чтобы избавиться от этого эффекта, я создал класс, производный от PanelDragDropTarget, где переопределил два метода, вызвавших проблему.

public class FixedPanelDragDropTarget : PanelDragDropTarget
{
    protected override bool CanAddItem(Panel itemsControl, object data)
    {
        return true;
    }

    protected override void InsertItem(Panel itemsControl, int index, object data)
    {
        //
    }

}

После этого в обработчике события FixedPanelDragDropTarget.Drop мы можем вручную создать экземпляр удаленного элемента, в то время как остальные выглядят так, как и предполагалось.

1 голос
/ 01 декабря 2011

Это происходит потому, что ListBoxDragDropTarget и PanelDragDropTarget написаны по-разному.При перетаскивании между 2 ListBoxDragDropTargets вы передаете часть данных, привязанную к элементу управления , тогда как при перетаскивании между 2 PanelDragDropTargets передается UIElement, который «подобран».

Вот почему Дмитрий должен ответить.PanelDragDropTarget проверяет, является ли элемент, который вы перетащили из ListBoxDragDropTarget, элементом UIElement, и, поскольку это не просто элемент данных, он возвращает false для CanAddItem.Это отключает возможность выпадения.Следовательно, вы видите курсор со стрелками вверх / вниз.

Чтобы все заработало, вы должны наследовать от PanelDragDropTarget и использовать вместо этого этот дочерний класс.Необходимо переопределить метод CanAddItem как минимум:

public class ElementDragDropTarget : PanelDragDropTarget
{
    protected override bool CanAddItem(Panel itemsControl, object data)
    {
        return true;
    }

    protected override void InsertItem(Panel itemsControl, int index, object data)
    {
        // Do Work
    }
}
0 голосов
/ 20 октября 2010

Ответ в следующем сообщении на форуме silverlight

http://forums.silverlight.net/forums/p/140806/463877.aspx

-Mohamed

...