WPF: как реализовать перетаскивание с помощью вложенных (иерархических) элементов управления

Используя WPF, мне удалось реализовать перетаскивание, чтобы изменить порядок элементов в списке (представлении или блоке), а также перетаскивать элементы между списками.

Теперь я пытаюсь понять, как реализовать перетаскивание с помощью списков NESTED.

Например, у меня есть представление списка, содержащее проекты, и каждый элемент проекта содержит другое представление списка задач. Я хочу иметь возможность перетаскивать, чтобы изменить порядок проектов, а также изменить порядок задач и перемещать их между проектами.

У меня есть код, который успешно выполняет одно из другого, но я не могу понять, как это сделать.

Похоже, что существует какое-то болезненное решение, которое включает тестирование попаданий и, возможно, z-порядок вложенных списков, но я не могу найти никаких примеров этого.

Кто-нибудь может предложить какие-либо указатели?

К вашему сведению: рабочий код, который я в настоящее время реализовал, основан на следующих двух превосходных статьях о перетаскивании WPF:

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

7 голосов | спросил Scrappydog 21 FebruaryEurope/MoscowbSat, 21 Feb 2009 01:01:51 +0300000000amSat, 21 Feb 2009 01:01:51 +030009 2009, 01:01:51

4 ответа


0

Поскольку MouseMove и большинство других в wpf являются маршрутизируемыми событиями, вы можете просто проверить e.OriginalSource в общем обработчике событий. Затем вы можете решить, какой элемент перетаскивать, основываясь на том, на каком элементе была мышь, возможно, используя один из тех методов поиска помощника «найти родителя, который удовлетворяет условию». Кроме того, вы можете установить e.Handled, если в визуальном дереве есть несколько элементов, подписывающихся на событие.

ответил Kenan E. K. 6 PM00000030000002431 2009, 15:49:24
0

Просто сначала подумайте, почему бы не использовать TreeView вместо ListView, если у вас будет вложение?

ответил Davy8 21 FebruaryEurope/MoscowbSat, 21 Feb 2009 01:06:14 +0300000000amSat, 21 Feb 2009 01:06:14 +030009 2009, 01:06:14
0

AllowDrop должен быть истинным для любого элемента управления.

ответил 6 PM00000030000002931 2009, 15:36:29
0

Я столкнулся с подобной проблемой при работе с приложением со списками вложенных пользовательских элементов управления.
Я обработал все это в PreviewMouseButtonDown event на уровне управления. Я проверяю координаты точки, по которой щелкнули. Если оно пришло откуда-то из родительского элемента ListBoxItem, которого не было в ListBox, я обрабатываю DragDrop.DoDragDrop() там. Если оно пришло из ListBoxItem, я бы опустил его до 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  

Так как click находился внутри Child's ListBox, событие переходит к самому низкому обработчику, который соответствует критериям для DragEvent.

Надеюсь, это поможет!

ответил Stephen McCusker 2 12009vEurope/Moscow11bEurope/MoscowMon, 02 Nov 2009 23:27:43 +0300 2009, 23:27:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132