WPF 拖拽功能

Posted on 2010-08-11 21:36 卞红军 阅读(616) 评论(0) 编辑 收藏
01 <Window x:Class="WpfApplication1.MainWindow"
03         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
04         Title="MainWindow" Height="350" Width="525">
05      
06     <Grid>
07         <Grid.ColumnDefinitions>
08             <ColumnDefinition Width="210"></ColumnDefinition>
09             <ColumnDefinition></ColumnDefinition>
10         </Grid.ColumnDefinitions>
11  
12         <ListView  x:Name="listView1" Grid.Column="0" AllowDrop="True"
13             PreviewMouseLeftButtonDown="listView1_PreviewMouseLeftButtonDown"
14             PreviewMouseMove="listView1_PreviewMouseMove">
15                 <ListViewItem>
16                     <Image Source="Resources\Images\a01.jpg"></Image>
17                 </ListViewItem>
18                 <ListViewItem>
19                     <Image Source="Resources\Images\a02.jpg"></Image>
20                 </ListViewItem>
21                 <ListViewItem>
22                     <Image Source="Resources\Images\a03.jpg"></Image>
23                 </ListViewItem>
24                 <ListViewItem>
25                     <Image Source="Resources\Images\a04.jpg"></Image>
26                 </ListViewItem>
27         </ListView>
28          
29         <Canvas x:Name="canvas1" Grid.Column="1" AllowDrop="True"
30               Drop="canvas1_Drop"  DragEnter="canvas1_DragEnter"  Background="Red">
31         </Canvas>
32     </Grid>
33  
34 </Window>

 

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;
05 using System.Windows;
06 using System.Windows.Controls;
07 using System.Windows.Data;
08 using System.Windows.Documents;
09 using System.Windows.Input;
10 using System.Windows.Media;
11 using System.Windows.Media.Imaging;
12 using System.Windows.Navigation;
13 using System.Windows.Shapes;
14 using System.Data;
15  
16 namespace WpfApplication1
17 {
18     /// <summary>
19     /// Interaction logic for MainWindow.xaml
20     /// </summary>
21     public partial class MainWindow : Window
22     {
23         Point startPoint;
24         ListBoxItem contact;
25  
26         public MainWindow()
27         {
28             InitializeComponent();
29         }
30  
31         private static T FindAnchestor<T>(DependencyObject current) where T : DependencyObject
32         {
33             do
34             {
35                 if (current is T)
36                 {
37                     return (T)current;
38                 }
39                 current = VisualTreeHelper.GetParent(current);
40             }
41             while (current != null);
42  
43             return null;
44         }
45  
46         private void listView1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
47         {
48             startPoint = e.GetPosition(null);
49         }
50  
51         private void listView1_PreviewMouseMove(object sender, MouseEventArgs e)
52         {
53             Point mousPos = e.GetPosition(null);
54             Vector diff = startPoint - mousPos;
55  
56             if ((e.LeftButton == MouseButtonState.Pressed) && (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance) && (Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
57             {
58                 ListViewItem listViewItem = FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource);
59                 if (listViewItem == null) { return; }
60  
61                 ListView listView = sender as ListView;
62                 contact = (ListViewItem)listView.ItemContainerGenerator.ItemFromContainer(listViewItem);
63                 DataObject dataObject = new DataObject("MyFormat", contact);
64                 DragDrop.DoDragDrop(listViewItem, dataObject, DragDropEffects.Move);
65             }
66         }
67  
68         private void canvas1_Drop(object sender, DragEventArgs e)
69         {
70             if (e.Data.GetDataPresent("MyFormat"))
71             {
72                 contact = e.Data.GetData("MyFormat") as ListBoxItem;
73                 Canvas CanvasView = sender as Canvas;
74                 this.listView1.Items.Remove(contact);
75                 CanvasView.Children.Add(contact);
76             }
77         }
78  
79         private void canvas1_DragEnter(object sender, DragEventArgs e)
80         {
81             if (!(e.Data.GetDataPresent("contact")) || (sender == e.Source))
82             {
83                 e.Effects = DragDropEffects.None;
84             }
85         }
86     }
87 }

参考阅读: 

Drag and Drop in WPF

http://www.wpftutorial.net/DragAndDrop.html



本文转载:CSDN博客