原文:WPF实现Drag/Drop操作

有时候我们方便用户操作,总会把一下Copy/Paste 或者 input操作转换为Drag/Drop, WPF 跟之前WinForm 一样提供了一些实现方式方便开发人员进行开发。

要允许控件Drop操作,首先必须设置控件属性AllowDrop,这样控件才能产生DragOver/DragEnter/Drop等相关事件,从而开发人员可以做一些逻辑判断,设置DragEventArgs 的属性Effects 决定Drag的内容是否允许Drop. 下面是一个简单的例子:

创建两个ListBox, 一个里面有内容(名字为:EmployeeSource),另外一个(名字:SelectedEmployees)没有内容,允许用户从EmployeeSource 拖拽内容到SelectedEmployees。

1. 在Xaml中创建这两个ListBox, 并进行相关数据绑定

        <ListBox x:Name="SelectedEmployees" HorizontalAlignment="Left" Height="100" Margin="35,30,0,0"
ItemsSource="{Binding SelectedEmployeeData}" DisplayMemberPath="Description"
VerticalAlignment="Top" Width="275" AllowDrop="True"
Drop="SelectedEmployees_Drop" DragOver="SelectedEmployees_DragOver" DragLeave="SelectedEmployees_DragLeave"
MouseMove="SelectedEmployees_MouseMove"/>
<ListBox x:Name="EmployeeSource" DataContext="{Binding Source={StaticResource EmployeeList}}"
SelectionMode="Single" HorizontalAlignment="Left" Height="100" Margin="35,255,0,0" VerticalAlignment="Top" Width="280"
ItemsSource="{Binding Employees}" DisplayMemberPath="Description" MouseMove="EmployeeSource_MouseMove"/>

2. 在cs文件中实现相关事件函数

        bool bMouseDown = true;
private void EmployeeSource_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
// TODO: Add event handler implementation here.
bMouseDown = e.LeftButton == MouseButtonState.Pressed;
if (EmployeeSource.SelectedItems.Count == 0 || !bMouseDown)
return;
ICollection<EmployeesItem> selected = new List<EmployeesItem>();
foreach(var item in EmployeeSource.SelectedItems)
{
var employee = item as EmployeesItem;
if (employee == null)
return;
selected.Add(employee);
}
DragDrop.DoDragDrop(EmployeeSource, selected, DragDropEffects.Copy);
} private void SelectedEmployees_Drop(object sender, System.Windows.DragEventArgs e)
{
// TODO: Add event handler implementation here.
var ems = e.Data.GetData(typeof(List<EmployeesItem>)) as List<EmployeesItem>;
if (ems == null)
return; foreach(var em in ems)
{
SelectedEmployeeData.Add(em);
}
} private void SelectedEmployees_DragOver(object sender, System.Windows.DragEventArgs e)
{
// TODO: Add event handler implementation here.
var ems = e.Data.GetData(typeof(List<EmployeesItem>)) as List<EmployeesItem>;
if (ems == null)
{
e.Effects = DragDropEffects.None;
return;
}
DragElement = ems[0];
e.Effects = DragDropEffects.Copy;
}

3. 增加DataContext(ViewModel), 设置绑定的属性

	public class EmployeeList : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
} public EmployeeList()
{
try
{
Uri resourceUri = new Uri("/WPFStudy;component/SampleData/EmployeeList/EmployeeList.xaml", UriKind.RelativeOrAbsolute);
System.Windows.Application.LoadComponent(this, resourceUri);
}
catch
{
}
} private Employees _Employees = new Employees(); public Employees Employees
{
get
{
return this._Employees;
}
}
} public class EmployeesItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
        public override bool Equals(object obj)
        {
            var tmp = obj as EmployeesItem;
            if (tmp == null) return false;
            return tmp.Description.Equals(Description);
        }

private string _Description = string.Empty; public string Description
{
get
{
return this._Description;
} set
{
if (this._Description != value)
{
this._Description = value;
this.OnPropertyChanged("Description");
}
}
}
} public class Employees : System.Collections.ObjectModel.ObservableCollection<EmployeesItem>
{
}

WPF实现Drag/Drop操作的更多相关文章

  1. HTML 学习笔记 (drag & drop)

    拖放(Drag & Drop)是一种常见的特性,即抓取对象以后拖到另一个位置.在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放.过去,我们用监听鼠标的Mousedown.Mouseo ...

  2. HTML5魔法堂:全面理解Drag & Drop API

    一.前言    在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面 ...

  3. Win10/UWP新特性—Drag&Drop 拖出元素到其他App

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

  4. JS魔法堂:IE5~9的Drag&Drop API

    一.前言     < HTML5魔法堂:全面理解Drag & Drop API>中提到从IE5开始已经支持DnD API,但IE5~9与HTML5的API有所不同,下面我们来了解一 ...

  5. [转]人人网首页拖拽上传详解(HTML5 Drag&Drop、FileReader API、formdata)

    人人网首页拖拽上传详解(HTML5 Drag&Drop.FileReader API.formdata) 2011年12月11日 | 彬Go 上一篇:给力的 Google HTML5 训练营( ...

  6. Android drag drop

    最近偶尔知道了锤子的one step,所以在网上看相关的东西,有人说android原生drag drop就能实现,我就去学习一下这个drag drop,下面把学习到的东西总结一下: drag drop ...

  7. atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结

    atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结 1. DND的操作流程 1 2. Html5 注 ...

  8. Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结

    Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制 ...

  9. HTML5中的拖拽与拖放(drag&&drop)

    1.drag 当拖动某个元素时,将会依次触发下列事件: 1)dragstart:按下鼠标键并开始移动鼠标时,会触发该事件 2)drag:dragstart触发后,随即便触发drag事件,而且在元素被拖 ...

随机推荐

  1. 七种数据库中Select Top的使用方法 (只显示数据库的几条记录)

    七种数据库中Select Top的使用方法 1. Oracle数据库  SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库  SELE ...

  2. thinkphp 快速缓存

    如果你的存储数据没有有效期的需求,那么系统还提供了一个快速缓存方法F可以用来更快的操作. 大理石平台厂家 F方法可以支持不同的存储类型,如果是文件类型的话,默认保存在DATA_PATH目录下面. 快速 ...

  3. electron-vue中关闭烦人的es语法检查

    本项目环境是 electron-vue搭建的项目,项目结构根vue-cli创建的项目结构稍微有所不同 主要修改的地方有3个 把这3个文件里面的以下代码全部删掉 { test: /\.(js)$/, e ...

  4. Vue的data选项使用注意

    使用组件时,大多数可以传入到Vue构造器中的选项可以在Vue extend()或 Vue.component() 中注册组件时使用,但是有一个重要的前提:data必须是函数 .在 var vm = n ...

  5. cnn知识点汇总

    关于卷积神经网络的入门基础知识: https://blog.csdn.net/weixin_42451919/article/details/81381294   卷积神经网络的相关公式推导: htt ...

  6. NX二次开发-UFUN修剪体UF_MODL_trim_body

    1 NX11+VS2013 2 3 4 #include <uf.h> 5 #include <uf_modl.h> 6 7 8 UF_initialize(); 9 10 / ...

  7. ICPC 2018 焦作区域赛

    // 2019.10.7 练习赛 // 赛题来源:2018 ICPC 焦作区域赛 // CF链接:http://codeforces.com/gym/102028 A Xu Xiake in Hena ...

  8. .net与C#

    一..net包含什么? 1.包含庞大的代码库,分为多个模块,可以自主选择 2.定义了基本的类型,被称为通用类型系统(CTS,common type system): 3.包含.NET公共语言运行库(C ...

  9. Phpthink入门基础大全(CURD部分)

    [ad code=1 align=center] $data[1]['name'] = ‘阳光雨' $data[1]['email'] = 'sccscc@vip.qq.com' $User>a ...

  10. 1-电脑C盘(系统盘)清理

    推荐,亲测有效! 转自: https://baijiahao.baidu.com/s?id=1612762644229315967&wfr=spider&for=pc