使用行为添加拖放功能

时间:2017-02-06 12:29:38

标签: c# wpf mvvm desktop-application attachedbehaviors

我需要修改使用WPF,MVVM和Behaviors进行事件处理的桌面应用程序。我有一个任务来实现Drag& Drop for a button。如果用户按下按钮,它将弹出一个文件保存窗口,但如果用户点击并拖动它,它应该显示一个文件图标,让用户将其放入资源管理器窗口将其保存在那里。

我已经添加了名称空间:

<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>

我还在按钮中添加了XAML代码:

{{1}}

但我不知道如何告诉行为类(FrameworkElementDragBehavior)要处理哪些事件以及如何处理它们(要调用哪些函数)。

我已经阅读了一些教程,但我仍然感到困惑。

1 个答案:

答案 0 :(得分:1)

两个月前我不得不用MVVM拖放。

经过一些研究,personnaly,实现这一目标的最佳方法是使用“GongSolutions DragDrop”库。 它非常简单,非常适合您的需求。 例如,在树视图中:

    <TreeView ItemsSource="{Binding LstCat}" 
              dd:DragDrop.IsDragSource="True" 
              dd:DragDrop.IsDropTarget="True"
              dd:DragDrop.DragAdornerTemplate="{StaticResource DragAdorner}">
    //Treeview Structure

    </TreeView>

从那里你可以在树视图中进行拖放操作。您也可以添加一个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