zoukankan      html  css  js  c++  java
  • wpf 拖拽有阴影效果

    using System;
    using System.Runtime.InteropServices;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    
    namespace WpfApp37
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private AdornerLayer mAdornerLayer;
            private DragDropAdorner adorner;
    
            public MainWindow()
            {
                InitializeComponent();
    
            }
    
            private void UIElement_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                if (sender is Border bd)
                {
                    bd.CaptureMouse();
                    //  DragDrop.DoDragDrop(bb, "", DragDropEffects.Copy);
                }
            }
    
            private void UIElement_OnMouseMove(object sender, MouseEventArgs e)
            {
                var pos = e.GetPosition(this);
                Console.WriteLine("move:" + pos.X + pos.Y);
                if (sender is Border bd)
                {
                    Console.WriteLine("move0000000------000");
    
                    if (bd.IsMouseCaptured)
                    {
                        Move();
    
                    }
    
    
    
                }
            }
    
            private void Move()
            { 
                adorner = new DragDropAdorner(tb);
                adorner.IsHitTestVisible = false;
                mAdornerLayer = AdornerLayer.GetAdornerLayer(cv);
                mAdornerLayer.IsHitTestVisible = false;
                mAdornerLayer.Add(adorner);
    
                DragDrop.DoDragDrop(tb, "", DragDropEffects.Copy);
    
                mAdornerLayer.Remove(adorner);
                mAdornerLayer = null;
            }
    
            private void UIElement_OnDragEnter(object sender, DragEventArgs e)
            {
    
            }
    
            private void UIElement_OnDragOver(object sender, DragEventArgs e)
            {
    
                e.Effects = DragDropEffects.Move | DragDropEffects.Copy;
            }
    
            private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
            {
    
            }
    
            private void Bb_OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                if (sender is Border bd)
                {
                    bd.ReleaseMouseCapture();
                    //  DragDrop.DoDragDrop(bb, "", DragDropEffects.Copy);
                }
            }
    
            private int i = 0;
            private void Bb_OnQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
            {
                if (e.KeyStates==(DragDropKeyStates.LeftMouseButton|DragDropKeyStates.AltKey) )
                {
                    e.Action = DragAction.Cancel;
                     e.Handled = true;
                }
                mAdornerLayer.Update();
                i++;
                Console.WriteLine("update   "+i);
            }
        }
    
    
        public class DragDropAdorner : Adorner
        {
            public Brush CustomBrush = null;
            public DragDropAdorner(UIElement parent)
                : base(parent)
            {
                IsHitTestVisible = false;
                mDraggedElement = parent as FrameworkElement;
            }
    
    
    
            protected override void OnRender(DrawingContext drawingContext)
            {
                base.OnRender(drawingContext);
                Console.WriteLine("Render///");
                if (mDraggedElement != null)
                {
                    Win32.POINT screenPos = new Win32.POINT();
                    if (Win32.GetCursorPos(ref screenPos))
                    {
                        Point pos = PointFromScreen(new Point(screenPos.X, screenPos.Y));
                        Rect rect = new Rect(pos.X, pos.Y, mDraggedElement.ActualWidth, mDraggedElement.ActualHeight);
    
                        drawingContext.PushOpacity(1.0);
                        Brush highlight = null;
                        if (CustomBrush == null)
                        {
                            highlight = mDraggedElement.TryFindResource(SystemColors.HighlightBrushKey) as Brush;
                        }
                        else
                        {
                            highlight = CustomBrush;
                        }
                        if (highlight != null)
                        {
                            drawingContext.DrawRectangle(highlight, new Pen(Brushes.Transparent, 0), rect);
                        }
    
                        Console.WriteLine($"{rect.X},{rect.Y},{rect.Width},{rect.Height}");
                        drawingContext.DrawRectangle(new VisualBrush(mDraggedElement),
                            new Pen(Brushes.Transparent, 0), rect);
                        drawingContext.Pop();
                    }
                    else
                    {
                        Console.WriteLine("false");
                    }
                }
            }
    
            private FrameworkElement mDraggedElement = null;
        }
        public static class Win32
        {
            public struct POINT { public Int32 X; public Int32 Y; }
    
            [DllImport("user32.dll")]
            public static extern bool GetCursorPos(ref POINT point);
        }
    }
  • 相关阅读:
    九月二十日
    九月十九日
    九月十八日
    九月十七日
    九月十六日
    大三第一周学习后的感悟及本学期计划
    阅读笔记09梦断代码
    阅读笔记08-梦断代码
    对搜狗现如今的用法进行评述
    寻找水王
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/12721396.html
Copyright © 2011-2022 走看看