WPF 拖拽功能

来源:互联网 发布:神经元算法机器人 编辑:程序博客网 时间:2024/05/16 17:48

WPF 拖拽功能

Posted on 2010-08-11 21:36 卞红军 阅读(616)评论(0) 编辑 收藏
view sourceprint?
01<Window x:Class="WpfApplication1.MainWindow"
02        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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>

 

01using System;
02using System.Collections.Generic;
03using System.Linq;
04using System.Text;
05using System.Windows;
06using System.Windows.Controls;
07using System.Windows.Data;
08using System.Windows.Documents;
09using System.Windows.Input;
10using System.Windows.Media;
11using System.Windows.Media.Imaging;
12using System.Windows.Navigation;
13using System.Windows.Shapes;
14using System.Data;
15 
16namespace WpfApplication1
17{
18    /// <summary>
19    /// Interaction logic for MainWindow.xaml
20    /// </summary>
21    publicpartial class MainWindow : Window
22    {
23        Point startPoint;
24        ListBoxItem contact;
25 
26        publicMainWindow()
27        {
28            InitializeComponent();
29        }
30 
31        privatestatic 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            returnnull;
44        }
45 
46        privatevoid listView1_PreviewMouseLeftButtonDown(objectsender, MouseButtonEventArgs e)
47        {
48            startPoint = e.GetPosition(null);
49        }
50 
51        privatevoid listView1_PreviewMouseMove(objectsender, 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 = senderas 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        privatevoid canvas1_Drop(objectsender, DragEventArgs e)
69        {
70            if(e.Data.GetDataPresent("MyFormat"))
71            {
72                contact = e.Data.GetData("MyFormat")as ListBoxItem;
73                Canvas CanvasView = senderas Canvas;
74                this.listView1.Items.Remove(contact);
75                CanvasView.Children.Add(contact);
76            }
77        }
78 
79        privatevoid canvas1_DragEnter(objectsender, 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