WPF TreeView перетаскивает элементы внутри - PullRequest
1 голос
/ 10 января 2020

Какова лучшая стратегия для реализации перетаскивания элементов внутри существующего элемента управления WPF TreeView? Это должен быть MVVM, и он должен иметь предварительный просмотр элемента, который перетаскивается из одной позиции в другую.

Посмотрел некоторые решения. Если я использую Canvas, я могу реализовать практически все что угодно, но тогда мне нужно будет начать управление с нуля, что выглядит как переизобретение колеса, учитывая, что мне нужна существующая функциональность TreeView. Пробовал и PopUp и Thumb, но я запутался, как правильно их использовать для реализации этой функциональности. Кроме того, имеет смысл, что я могу использовать PreviewMouseOver для объектов выше целевого TreeViewItems; Я должен быть в состоянии отменить действие удаления в зависимости от определенных правил, например, я не могу бросить автомобильный объект на категорию животных.

Я проверил некоторые коммерческие решения, и в них уже есть аналогичные функциональные возможности; но мне было интересно, есть ли какое-нибудь бесплатное или открытое решение тоже? Или хотя бы узнать, как они достигли этой функциональности в коммерческих библиотеках?

1 Ответ

2 голосов
/ 10 января 2020

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

Если вы хотите чтобы реализовать это самостоятельно, я бы посоветовал вам изучить документацию msdn здесь: Обзор перетаскивания . Вам необходимо реализовать события, перечисленные в разделе События перетаскивания .

Чтобы ответить на указанные c баллы за ваш вопрос:

  • «Правила» того, что конкретная цель отбрасывания c может принять в качестве отбрасывания, реализованы в событии DragOver. Во время этого события вы устанавливаете e.Effects на None, чтобы указать, что отбрасывание недопустимо, или на одно из других значений, чтобы указать, как интерпретация отбрасывания.
  • Для предварительного просмотра перетаскиваемого объекта лучше всего использовать Adorners . Вы можете создать украшение, которое следует за мышью во время операции перетаскивания и даже может заставить его отображать изображение элемента пользовательского интерфейса, который вы перетаскиваете, используя VisualBrush.
    Просто знайте, что обычные события мыши, такие как MouseMove don ' он не работает, пока выполняется операция перетаскивания, поэтому вам придется придерживаться DragOver (который поднимается только элементами с AllowDrop, установленными на True), или использовать некоторые p / invoke magi c. Вы можете проверить мой вопрос по этой точной теме c вместе с ответом, который я в конечном итоге придумал: WPF - отслеживать мышь во время перетаскивания, пока AllowDrop = False .
...