Реализация перетаскивания для узлов TreeView в Avalonia

Как реализовать поведение перетаскивания в элементе управления TreeView? Примером может служить проводник, в котором пользователь может перемещать файл из одной папки в другую путем перетаскивания.

У меня есть следующий код в моем XAML:

<TreeView Items="{Binding RootFiles}">
   <TreeView.ItemTemplate>
     <TreeDataTemplate ItemsSource="{Binding Files}">
         <TextBlock Text="{Binding Name}"/>
     </TreeDataTemplate>
   </TreeView.ItemTemplate>
</TreeView>

файловый менеджер

Как сделать узлы перетаскиваемыми?

1 ответ

Решение

К сожалению, пока у нас нет надлежащей поддержки drag-n-drop, поэтому вам нужно реализовать ее вручную.

Я опишу, как я сделал нечто подобное с адаптациями для вашего случая.

Вы можете обрабатывать события мыши на уровне управления TreeView. когда MouseDown пожары, нужно проверить PointerOverElement свойство для определения, находится ли мышь в данный момент внутри одного из узлов дерева (используйте свойство Parent для обхода дерева или просто проверьте DataContext), если это так, вам нужно где-то сохранить указанный узел. когда MouseMove событие срабатывает при нажатии одной из кнопок мыши, вам нужно захватить мышь, и с этого момента ваш код находится в состоянии "перетаскивания". Вы можете изменить TreeView Cursor свойство, чтобы предоставить некоторую обратную связь с пользователем, когда MouseUp После запуска необходимо определить положение курсора относительно других узлов и внести соответствующие изменения в модель, поддерживающую TreeView.

Другие вопросы по тегам