2011-06-22 14 views
2

私はWPFを使用して2つのリストビューを作成し、ドラッグドロップ機能を実装しています。 (リスト内ビューとリスト間ビューの両方)WPF - ドラッグドロップ - Adornerがコントロールの外側に消える

私は興味深い記事hereを見つけました。

ただし、問題があります。 listView1からlistviewitemをドラッグすると、listView1の中だけにadorner(ゴーストイメージ)が表示されます。 ListView2にlistviewItemをドロップしたいとき、私はそこにもアドナーを見る必要があります。基本的に、adornerは、ドラッグ操作が開始されたlistViewにのみ表示されます。 listViewの外に出ると、それは消えます。

ドラッグを開始したコントロールの外側でアドヴァーナーを見えるようにする方法がありませんでした。

誰か助けてもらえますか?

答えて

2

GiveFeedbackイベントをワイヤして、リストビューを超えてadornerの場所を更新します。下記の実施例および方法からListViewのプロパティを更新しました(とlistview_DragLeave方法であなたはadornerを崩壊するとは思わないだろう):

/// <summary> 
    /// Gets/sets the ListView whose dragging is managed. This property 
    /// can be set to null, to prevent drag management from occuring. If 
    /// the ListView's AllowDrop property is false, it will be set to true. 
    /// </summary> 
    public ListView ListView 
    { 
     get { return listView; } 
     set 
     { 
      if(this.IsDragInProgress) 
       throw new InvalidOperationException("Cannot set the ListView property during a drag operation."); 

      if(this.listView != null) 
      { 
       #region Unhook Events 

       this.listView.PreviewMouseLeftButtonDown -= listView_PreviewMouseLeftButtonDown; 
       this.listView.PreviewMouseMove -= listView_PreviewMouseMove; 
       this.listView.DragOver -= listView_DragOver; 
       this.listView.DragLeave -= listView_DragLeave; 
       this.listView.DragEnter -= listView_DragEnter; 
       this.listView.GiveFeedback -= listView_GiveFeedback; 
       this.listView.Drop -= listView_Drop; 

       #endregion // Unhook Events 
      } 

      this.listView = value; 

      if(this.listView != null) 
      { 
       if(!this.listView.AllowDrop) 
        this.listView.AllowDrop = true; 

       #region Hook Events 

       this.listView.PreviewMouseLeftButtonDown += listView_PreviewMouseLeftButtonDown; 
       this.listView.PreviewMouseMove += listView_PreviewMouseMove; 
       this.listView.DragOver += listView_DragOver; 
       this.listView.DragLeave += listView_DragLeave; 
       this.listView.DragEnter += listView_DragEnter; 
       this.listView.GiveFeedback += listView_GiveFeedback; 
       this.listView.Drop += listView_Drop; 

       #endregion // Hook Events 
      } 
     } 
    } 

    void listView_GiveFeedback(object sender, GiveFeedbackEventArgs e) 
    { 
     if (this.ShowDragAdornerResolved) 
      this.UpdateDragAdornerLocation(); 
    } 
+0

おかげで、私が出会ったデイブ、それは素晴らしい作品... –

+0

もう一つ私はこれで遊んでいた。つまり、2番目のリストビューを表示するアニメーションポップアップがある場合、Adornerは表示されなくなります。これはページ上でのみ表示され、ポップアップでは表示されません。この制約を克服することは可能でしょうか? –

+0

Niharありがとう、窓越しにどのようにレンダリングするかわからないので、いくつかの研究が必要です。 :-) –

関連する問題