博客园  :: 首页  :: 订阅 订阅  :: 管理

WPF 拖拽功能

Posted on 2010-08-11 21:36  卞红军  阅读(4469)  评论(1编辑  收藏  举报
<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

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