我已经实现了一个小 WPF 应用程序来将动物从商店拖到我的谷仓。;-)
我在用着:
- MVVMlight 及其
EventToCommand
行为 - 动物是一个简单的
Border
听MouseDown
- 谷仓
ItemsControl
绑定到ObservableCollection
ViewModel 的一个。它监听 3 个事件:DragEnter
(将虚拟动物添加ObservableCollection
到预览动物在谷仓中的位置)DragLeave
(如果动物没有掉落,则移除虚拟动物)Drop
(将动物放在谷仓的指定位置)。
对不起。我没有上传图片的声誉。所以我尝试了一些 ascii 艺术(尝试将驴拖入谷仓的图像):
Shop | Barn
-------------------------
Mouse | [Mouse] [Dog]
Cat | [.]
Dog | ^
Donkey-|--|
这是问题所在:
如果我将动物拖入谷仓到它的指定空间(预览假人):
DragLeave
删除虚拟项目并立即DragEnter
将被解雇以重绘虚拟项目。转到步骤 1。
无限循环。闪烁已启动并运行!
有谁知道一个不错的小解决方法?
所以这是我的 ViewModel 的代码:
private string _dummy;
public ObservableCollection<string> Animals { get; private set; }
private void StartDrag(FrameworkElement element)
{
var animal = element.DataContext as string;
if (animal == null) return;
System.Windows.DragDrop.DoDragDrop(element, animal, DragDropEffects.Copy);
}
private void PreviewDrop(DragEventArgs args)
{
if (args.Data.GetDataPresent(typeof (string)))
AddDummy();
}
private void StopDrop(DragEventArgs args)
{
RemoveDummy();
}
private void Drop(DragEventArgs args)
{
var animal = args.Data.GetData(typeof (string)) as string;
if (animal == null) return;
RemoveDummy();
Animals.Add(animal);
}
private void RemoveDummy()
{
if (_dummy == null) return;
Animals.Remove(_dummy);
_dummy = null;
}
private void AddDummy()
{
if (_dummy != null) return;
_dummy = ".";
Animals.Add(_dummy);
}
谢谢你的帮助
马塞尔