我正在使用SilverLight Toolkit在Silverlight 4 Web应用程序中实现一些拖放功能。我的拖动源是一个列表框,我有十八个潜在的降落目标。我需要根据拖动对象上的字符串值允许/禁止删除。
我没有问题进行比较并确定是否允许将项目放在目标上,但是,我无法确定要处理的最佳事件,以及如何使其不接受下降。
我看过DragEnter事件,这看起来是处理这个问题的最佳场所,但我不太清楚我需要做些什么来让它不掉线。这是我尝试过的一些代码的片段,但它并不能阻止掉线:
lbDragDrop.DragEnter += (src, e) =>
{
VaultSocketViewModel vm = this.DataContext as VaultSocketViewModel;
ListBoxDragDropTarget target = src as ListBoxDragDropTarget;
ObservableCollection<ItemModel> listBoxBinding = vm.Slots[target.Name];
object data = e.Data.GetData(e.Data.GetFormats()[0]);
ItemDragEventArgs eventArgs = data as ItemDragEventArgs;
SelectionCollection coll = eventArgs.Data as SelectionCollection;
ItemModel newItem = coll.Select(t => t.Item).OfType<ItemModel>().FirstOrDefault();
if (!target.Name.StartsWith(newItem.ItemSlot)) // don't allow drop
{
e.Effects = Microsoft.Windows.DragDropEffects.None;
e.Handled = true;
}
else
{
}
};
答案 0 :(得分:1)
将效果更改为无(就像你正在做的那样)应该足够了 - 一个很好的例子是工具包本身的树视图拖放目标中的一些内部代码(SetEffects方法)
http://silverlight.codeplex.com/SourceControl/changeset/view/57505#779753
答案 1 :(得分:0)
所以,的确如此,只要你在正确的地方做到这一点。我已经把我的代码放在DragEnter
事件处理程序中处理它,它应该在DragOver
事件处理程序中完成。改变DragEnter
中的效果就像雷尼尔沃尔夫卡斯勒的放射性人护目镜 - 他们什么都不做。
所以,有效的代码如下:
lbDragDrop.DragOver += (src, e) =>
{
VaultSocketViewModel vm = this.DataContext as VaultSocketViewModel;
ListBoxDragDropTarget target = src as ListBoxDragDropTarget;
ObservableCollection<ItemModel> listBoxBinding = vm.Slots[target.Name];
object data = e.Data.GetData(e.Data.GetFormats()[0]);
ItemDragEventArgs eventArgs = data as ItemDragEventArgs;
SelectionCollection coll = eventArgs.Data as SelectionCollection;
ItemModel newItem = coll.Select(t => t.Item).OfType<ItemModel>().FirstOrDefault();
if (!target.Name.StartsWith(newItem.ItemSlot)) // don't allow drop
{
e.Effects = Microsoft.Windows.DragDropEffects.None;
e.Handled = true;
}
else
{
}
};