Реализация перетаскивания для узлов 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.