zhangsongcui

DragDropAdorner

Feb 6th, 2015
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.10 KB | None | 0 0
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Documents;
  5. using System.Windows.Media;
  6. using System.Windows.Media.Animation;
  7.  
  8. namespace WpfApplication1 {
  9.     /// <summary>
  10.     /// MainWindow.xaml 的交互逻辑
  11.     /// </summary>
  12.     public partial class MainWindow {
  13.         public MainWindow() {
  14.             InitializeComponent();
  15.         }
  16.  
  17.         private DragDropAdorner adorner;
  18.  
  19.         private void Item_MouseDown(object sender, RoutedEventArgs e) {
  20.             var item = ((ListBoxItem) sender);
  21.             Point startPos = item.TranslatePoint(MouseUtilities.CorrectGetPosition(item), MainGrid);
  22.             var layer = AdornerLayer.GetAdornerLayer(MainGrid);
  23.             layer.IsHitTestVisible = false;
  24.  
  25.             adorner = new DragDropAdorner(item, MouseUtilities.CorrectGetPosition(MainGrid), (Vector) startPos) {
  26.                 Opacity = 0.6
  27.             };
  28.             layer.Add(adorner);
  29.             if (DragDrop.DoDragDrop(item, item.Content, DragDropEffects.Move) != DragDropEffects.Move) {
  30.                 var anime = new PointAnimation(adorner.StartPoint, new Duration(TimeSpan.FromSeconds(0.5))) {
  31.                     EasingFunction = new QuarticEase { EasingMode = EasingMode.EaseOut }
  32.                 };
  33.                 anime.Completed += (sender1, e1) => layer.Remove(adorner);
  34.                 adorner.BeginAnimation(DragDropAdorner.PositionProperty, anime);
  35.             } else {
  36.                 layer.Remove(adorner);
  37.             }
  38.         }
  39.  
  40.         private void Item_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) {
  41.             adorner.Position = MouseUtilities.CorrectGetPosition(MainGrid);
  42.         }
  43.  
  44.         private void Item_Drop(object sender, DragEventArgs e) {
  45.             var target = (ListBoxItem) sender;
  46.             var source = ((ListBoxItem) adorner.AdornedElement);
  47.             var temp = source.Content;
  48.             source.Content = target.Content;
  49.             target.Content = temp;
  50.         }
  51.     }
  52.  
  53.     public class DragDropAdorner : Adorner {
  54.         public Point Position {
  55.             get { return (Point) GetValue(PositionProperty); }
  56.             set { SetValue(PositionProperty, value); }
  57.         }
  58.  
  59.         public static readonly DependencyProperty PositionProperty =
  60.             DependencyProperty.Register("Position", typeof (Point), typeof (DragDropAdorner), new PropertyMetadata(
  61.                 (sender, e) => ((DragDropAdorner) sender).InvalidateVisual()));
  62.  
  63.         public Vector Vector { get; private set; }
  64.         public Point StartPoint { get; private set; }
  65.  
  66.         public DragDropAdorner(UIElement element, Point startPoint, Vector vector = default(Vector))
  67.             : base(element) {
  68.             StartPoint = startPoint;
  69.             Vector = vector;
  70.             Position = startPoint;
  71.         }
  72.  
  73.         protected override void OnRender(DrawingContext drawingContext) {
  74.             base.OnRender(drawingContext);
  75.  
  76.             drawingContext.DrawRectangle(new VisualBrush(AdornedElement),
  77.                 null, new Rect(Position - Vector, RenderSize));
  78.         }
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment