<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="210"></ColumnDefinition> <ColumnDefinition></ColumnDefinition> </Grid.ColumnDefinitions> <ListView x:Name="listView1" Grid.Column="0" AllowDrop="True" PreviewMouseLeftButtonDown="listView1_PreviewMouseLeftButtonDown" PreviewMouseMove="listView1_PreviewMouseMove"> <ListViewItem> <Image Source="Resources\Images\a01.jpg"></Image> </ListViewItem> <ListViewItem> <Image Source="Resources\Images\a02.jpg"></Image> </ListViewItem> <ListViewItem> <Image Source="Resources\Images\a03.jpg"></Image> </ListViewItem> <ListViewItem> <Image Source="Resources\Images\a04.jpg"></Image> </ListViewItem> </ListView> <Canvas x:Name="canvas1" Grid.Column="1" AllowDrop="True" Drop="canvas1_Drop" DragEnter="canvas1_DragEnter" Background="Red"> </Canvas> </Grid> </Window>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data; namespace WpfApplication1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { Point startPoint; ListBoxItem contact; public MainWindow() { InitializeComponent(); } private static T FindAnchestor<T>(DependencyObject current) where T : DependencyObject { do { if (current is T) { return (T)current; } current = VisualTreeHelper.GetParent(current); } while (current != null); return null; } private void listView1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { startPoint = e.GetPosition(null); } private void listView1_PreviewMouseMove(object sender, MouseEventArgs e) { Point mousPos = e.GetPosition(null); Vector diff = startPoint - mousPos; if ((e.LeftButton == MouseButtonState.Pressed) && (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance) && (Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) { ListViewItem listViewItem = FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource); if (listViewItem == null) { return; } ListView listView = sender as ListView; contact = (ListViewItem)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); DataObject dataObject = new DataObject("MyFormat", contact); DragDrop.DoDragDrop(listViewItem, dataObject, DragDropEffects.Move); } } private void canvas1_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("MyFormat")) { contact = e.Data.GetData("MyFormat") as ListBoxItem; Canvas CanvasView = sender as Canvas; this.listView1.Items.Remove(contact); CanvasView.Children.Add(contact); } } private void canvas1_DragEnter(object sender, DragEventArgs e) { if (!(e.Data.GetDataPresent("contact")) || (sender == e.Source)) { e.Effects = DragDropEffects.None; } } } }
参考阅读:
Drag and Drop in WPF