2010-12-02 8 views
0

Silverlight 4 Webアプリケーションで、SilverLight Toolkitを使用してドラッグ&ドロップ機能を実装しています。私のドラッグソースはリストボックスであり、私は18個の潜在的なドロップターゲットを持っています。ドラッグされたオブジェクトの文字列値に基づいてドロップを許可/禁止する必要があります。Silverlight Toolkitを使用してドラッグドロップを許可するかどうかをコードで判断します。

私は比較を行い、アイテムがターゲット上にドロップされることが許されているかどうかを判断することに問題はありませんが、最高のイベントが何を処理するのかがわかりません。ドロップを受け入れる。

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

あり、Iは近かったです。 @ジェームスマニングが答えて言ったように、「ただ効果を「なし」に変更するだけで十分だ」

あなたが正しい場所で行っている限り、真実です。 DragOverイベントハンドラで完了したはずのときに、私はこのコードをDragEnterイベントハンドラに入れました。 DragEnterの効果を変更することは、Rainier WolfcastleのRadioactive Manゴーグルのようなものです。何もしません。

次のように、動作するコードは次のとおりです。

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 
      { 

      } 


     }; 
1

はちょうど(あなたがやっているような)なしにエフェクトを変更する十分なはずです - 良い例さてツールキット自体にツリービュードラッグドロップターゲット内の内部コードの一部(SetEffects方法)

http://silverlight.codeplex.com/SourceControl/changeset/view/57505#779753

+0

私は上記のコードを試みたが、それはまだドロップすることができます。私は現在Dropイベントハンドラのドロップの適用可能性をチェックしています。私は時間があるときにこれを再訪し、もう一度やり直します。それがうまくいけば、私は正しいとマークします。 – Robaticus

+0

ご連絡ありがとうございます。私はあなたのために正しい方向に私のお尻を押すためにあなたを+1しました。 – Robaticus

関連する問題