Добавить 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

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