動物を店から納屋にドラッグする小さな WPF アプリを実装しました。;-)
私は使用しています:
- MVVMlight とその
EventToCommand
動作 - 動物は単純な
Border
リスニングですMouseDown
- 納屋はViewModel の に
ItemsControl
バインドされています。ObservableCollection
3 つのイベントをリッスンします。DragEnter
(ダミー動物を に追加してObservableCollection
、動物が納屋のどこに配置されているかをプレビューします)DragLeave
(動物がドロップされていない場合は、ダミーの動物を削除します)Drop
(動物を納屋の指定された場所に置きます)。
ごめん。画像をアップロードするという評判はありません。だから私はいくつかのアスキーアートを試します(ロバを納屋にドラッグするイメージを試してみてください):
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);
}
ご協力いただきありがとうございます
マルセル