Добавить Drag&Drop с поведением
Мне нужно изменить настольное приложение, которое использует WPF, MVVM и Поведения для обработки событий. У меня есть задача реализовать Drag&Drop для кнопки. Если пользователь нажимает кнопку, появляется всплывающее окно сохранения файла, но если пользователь щелкает и перетаскивает его, он должен отобразить значок файла и позволить пользователю перетащить его в окно проводника, чтобы сохранить его там.
Я уже добавил пространства имен:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:behaviors="clr-namespace:MyApplication.Desktop.Client.Behaviors"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
xmlns:command="http://www.galasoft.ch/mvvmlight"
Я также добавил XAML-код в кнопку:
<Button Grid.Column="2"
Command="{Binding SaveAttachmentCommand}"
Visibility="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource boolToVisibilityConverter}}"
Style="{StaticResource AttachmentSaveButtonStyle}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewMouseLeftButtonDown">
<command:EventToCommand Command="{Binding LeftMouseButtonDownCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<i:Interaction.Behaviors>
<behaviors:FrameworkElementDragBehavior>
</behaviors:FrameworkElementDragBehavior>
</i:Interaction.Behaviors>
</Button>
Но я не знаю, как сказать классу поведения (FrameworkElementDragBehavior), какие события обрабатывать и как их обрабатывать (какие функции вызывать).
Я прочитал несколько уроков, но я все еще в замешательстве.
1 ответ
Я должен был сделать Drag and drop с MVVM два месяца назад.
После некоторых исследований, лично, лучший способ достичь этого - работать с библиотекой GongSolutions DragDrop. Это очень просто и идеально подходит для того, что вы ищете. Например, в виде дерева:
<TreeView ItemsSource="{Binding LstCat}"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.DragAdornerTemplate="{StaticResource DragAdorner}">
//Treeview Structure
</TreeView>
Оттуда вы можете сделать Drag&Drop в виде дерева. Вы также можете добавить dragAdorner (изображение рядом с указателем при перетаскивании чего-либо)
В viewModel вы можете сказать поведение перетаскивания или падения, реализовав интерфейс, который поставляется с библиотекой. Таким образом, вы можете получить доступ к данным вашего перетаскивания. Например:
public void DragOver(IDropInfo dropInfo)
{
if (dropInfo.Data is Category && dropInfo.TargetItem is Rubrique)
{
return;
}
dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
dropInfo.Effects = DragDropEffects.Move;
}
Вот ссылка на библиотеку, если вы заинтересованы: https://github.com/punker76/gong-wpf-dragdrop