使用Silverlight 4工具包,是否可以从ListBox拖放到Canvas(并在下拉到Canvas中获取事件)?
我能够编写代码以从PanelDragDropTarget内的包装面板拖放到画布,但事件处理程序在发生删除时没有触发。当我尝试从ListBoxDragDrop内的ListBox拖放到PanelDragDropTarget内的Canvas时,没有发生删除(并且事件处理程序没有触发)。在“画布”上拖动时,光标变为带有向上/向下箭头的光标。
谢谢,特德
答案 0 :(得分:2)
在穆罕默德的帖子中描述的步骤之后,仍然存在一些问题。当您将鼠标悬停在目标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事件的处理程序中,我们可以手动创建被删除元素的intance,而其余部分看起来应该是这样。
答案 1 :(得分:1)
出现此问题的原因是ListBoxDragDropTarget和PanelDragDropTarget的编写方式不同。在2个ListBoxDragDropTargets之间拖动时,您正在传输绑定到控件的数据,而在2个PanelDragDropTargets之间拖动会传输“拾取”的UIElement。
这就是为什么需要Dmitriyz的回答。 PanelDragDropTarget检查您从ListBoxDragDropTarget拖动的元素是否是UIElement,并且由于它不是,它只是一个简单的数据片段,它为CanAddItem返回false。它禁用了丢弃的能力。因此,您可以使用向上/向下箭头看到光标。
要使一切正常,您必须从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
}
}
答案 2 :(得分:0)