原文: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. 【RabbitMQ】六种模式与SpringBoot整合

    添加rabbitmq的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  2. linux中hadoop组件启动日志存放问题

    如果是nohup xxxx &的话会在当前目录下生成一个nohup文件存放当前出现所有的日志,&表示后台启动: 当然你也可以将日志存放在>/dev/null表示当前日志存放的位置 ...

  3. 51nod 1556 计算(递推)

    传送门 解题思路 在一个网格图上走\(n\)步,每次可以向右上,右下,右,但必须在第一象限,最后从\((0,0)\)走到\((n,0)\)的方案数为默慈金数.递推式为\(m[i+1]=\frac{(2 ...

  4. cdq分治·三维偏序问题

    转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ...

  5. 禁用NX软件启动欢迎界面[转载]

    环境变量UGII_BACKGROUND_URL  NONE 转载自https://www.ugnx.net/wt/414

  6. Java-Class-@I:org.junit.runner.RunWith

    ylbtech-Java-Class-@I:org.junit.runner.RunWith 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部 1. package org.juni ...

  7. 杂项:ionic

    ylbtech-杂项:ionic ionic是一个用来开发混合手机应用的,开源的,免费的代码库.可以优化html.css和js的性能,构建高效的应用程序,而且还可以用于构建Sass和AngularJS ...

  8. java.sql.SQLException: ORA-12704: 字符集不匹配

    INFO:HibernateSimpleDao----queryForListWithSql:SELECT site_id as id ,MAX(case attr_name when 'siteNa ...

  9. JAVA泛型知识(一)

    Java泛型知识(二)<? extends T>和<? super T> Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 目        录 ...

  10. Python做数据预处理

    在拿到一份数据准备做挖掘建模之前,首先需要进行初步的数据探索性分析(你愿意花十分钟系统了解数据分析方法吗?),对数据探索性分析之后要先进行一系列的数据预处理步骤.因为拿到的原始数据存在不完整.不一致. ...