2009-02-20 9 views
7

WPFを使用するドラッグアンドドロップを実装してリスト内のアイテムを再配置したり、リスト間で項目をドラッグアンドドロップすることに成功しました。WPF:ネストされた(階層的な)コントロールでドラッグアンドドロップを実装する方法

ここでは、ネストされたリストでドラッグアンドドロップを実装する方法を理解しようとしています。

たとえば、プロジェクトを含むリストビューがあり、各プロジェクトアイテムにはタスクの別のリストビューが含まれています。ドラッグアンドドロップしてプロジェクトの順序を並べ替えたり、タスクを並べ替えたり、プロジェクト間で移動したりできます。

私はもう一方のコードを正常に実行するコードを持っていますが、両方を行う方法を理解できません。

ヒットテストやネストされたリストのzオーダーなどの痛い解決策があるようですが、これの例は見つかりません。

誰でもポインタを提供できますか? FYI

:私は現在、WPFのドラッグ&ドロップで次の2件の優れた記事に基づいて実装した作業コードは:

http://bea.stollnitz.com/blog/?p=53 http://www.codeproject.com/KB/WPF/ListViewDragDropManager.aspx

答えて

2

ただ、最初の考えがある、なぜ代わりにTreeViewコントロールを使用しませんあなたが入れ子にするつもりなら、ListViewの?

+0

良い考え...ドラッグアンドドロップ機能を実装する方が簡単だと思います...それは私にいくつかの新しいUIの外観と感じの課題を与えるだろう... – Scrappydog

0

AllowDropは、どのコントロールでもtrueでなければなりません。

4

MouseMoveとwpfのほとんどのものはルーティングされたイベントなので、共通のイベントハンドラでe.OriginalSourceをチェックすることができます。次に、マウスがどの要素に基づいてどの要素をドラッグするかを決めることができます。おそらく、「条件を満たす親を見つける」ヘルパーメソッドテクニックの1つを使用します。さらに、イベントにサブスクライブするビジュアルツリーに複数の要素がある場合は、e.Handledを設定できます。

+0

これは私が必要なものです!ありがとうございました –

+0

私はここに "条件を満たす親を見つける"という方法があるかもしれないことを具体的に探してきました。条件は通常 "タイプ"です。 'VisualTreeHelper.GetParent(child)'メソッドを使用する汎用実装 'FindParent 'があります:http://www.infragistics.com/community/blogs/blagunas/archive/2013/05/29/find-the-parent -control-of-a-specific-type-in​​-wpf-and-silverlight.aspx – Triynko

0

ネストされたユーザーコントロールのリストボックスを使用してアプリケーションを操作しているときも同様の問題が発生しました。
私はPreviewMouseButtonDown eventでこれをすべてコントロールレベルで処理しました。私はクリックされたポイントの座標をチェックします。それがListBoxになかった親のListBoxItemのどこから来たのであれば、そこでDragDrop.DoDragDrop()を処理します。もしそれがListBoxItemの中から来たのであれば、それを子供ListBoxのPreviewMouseButtonDown eventにバブルダウンさせます。子アイテムのListBox内の場所を確認して、どのアイテムがクリックされたかを確認します。そのため、代わりにこのレベルのDragDropを実行します。

擬似コードは以下の通りである:

Parent ListBox 
-- PListBoxItem1 
-- PListBoxItem2 
-- PListBoxItem3 
---- Child ListBox 
------ Child ListBoxItem1 
------ Child ListBoxItem2 -Click drag started here 
------ Child ListBoxItem3 

コード:

Parent_List_Box_PreviewMouseButtonDown 
If mouse position is not inside the Child ListBox Then 
    DoDragDrop() on the Parent level with this ListBoxItem 
End If 

Child_ListBox_PreviewMouseButtonDown 
Determine which item the mouse was clicked on relative to the Child ListBox 
DoDragDrop() on the Child level with this ListBoxItem 

だからclickChild's ListBox中にあったので、イベントが基準を通過最低ハンドラまで気泡DragEvent

希望すると便利です。