wpf中移动拖拽控件

wpf和winform不一样,wpf的mousemove和mousedown等等,都是在鼠标在控件内触发,鼠标移出控件即不触发,所以拖动控件的时候会出现bug,以下提供一种解决办法。

首先实例化一个Canvas布局:

<Canvas x:Name="c" MouseDown="c_MouseDown " MouseMove="c_MouseMove " MouseUp="c_MouseUp "></Canvas>

  1. public partial class Window1 : Window   
  2.     {   
  3.         private bool dragging;   
  4.         Point mousePoint;   
  5.         Rectangle shadow = new Rectangle();//显示控件阴影的矩形   
  6.            
  7.         Control mouseCtrl = null;//被拖动的控件   
  8.   
  9.         public Window1()   
  10.         {   
  11.             InitializeComponent();   
  12.             FullScreenManager.RepairWpfWindowFullScreenBehavior(this);   
  13.             dragging = false;           
  14.             shadow.Opacity = 0.5;  //阴影加点透明度       
  15.             c.Children.Add(shadow);//阴影加入canvas   
  16.             shadow.Visibility = Visibility.Hidden ;//隐藏shadow   
  17.         }   
  18.   
  19.         private void c_MouseDown(object sender, MouseButtonEventArgs e)   
  20.         {   
  21.            if (e.LeftButton == MouseButtonState.Pressed)   
  22.             {   
  23.                 dragging = true;//标记鼠标按下   
  24.                 mousePoint = e.GetPosition(this.c);//获取鼠标在但前canvas内的位置   
  25.                 mouseCtrl = (Control)e.Source;   //获得事件触发的源,即哪个控件     
  26.                 VisualBrush v;   
  27.                 v = new VisualBrush(mouseCtrl);//利用VisualBrush得到控件的影像   
  28.                 shadow.Width = mouseCtrl.Width;   
  29.                 shadow.Height = mouseCtrl.Height;   
  30.                 shadow.Fill = v;//将影像填充给矩形   
  31.                 Canvas.SetLeft(shadow, Canvas.GetLeft(mouseCtrl));   
  32.                 Canvas.SetTop(shadow, Canvas.GetTop(mouseCtrl));   
  33.                 shadow.Visibility = Visibility.Visible;//使矩形可见   
  34.                 //Canvas.SetZIndex(shadow, 0);//可以通过SetZIndex设置阴影的z方向位置   
  35.                 c.CaptureMouse();//强制捕获鼠标。这在对于背景透明的窗体里面是必须的   
  36.             }   
  37.         }   
  38.   
  39.         private void c_MouseMove(object sender, MouseEventArgs e)   
  40.         {   
  41.             if (dragging)   
  42.             {   
  43.                 if (e.LeftButton == MouseButtonState.Pressed)   
  44.                 {   
  45.                     Point theMousePoint = e.GetPosition(this.c);   
  46.                     Canvas.SetLeft(shadow, theMousePoint.X - (mousePoint.X - Canvas.GetLeft(shadow)));   
  47.                     Canvas.SetTop(shadow, theMousePoint.Y - (mousePoint.Y - Canvas.GetTop(shadow)));//简单的计算,只移动shadow   
  48.                     mousePoint = theMousePoint;    
  49.                 }   
  50.             }   
  51.         }   
  52.   
  53.         private void c_MouseUp(object sender, MouseButtonEventArgs e)   
  54.         {   
  55.             dragging = false;   
  56.             Mouse.Capture(null);//取消强制捕获   
  57.             shadow.Visibility = Visibility.Hidden;//隐藏shadow   
  58.             Canvas.SetLeft(mouseCtrl  , Canvas.GetLeft(shadow ));   
  59.             Canvas.SetTop(mouseCtrl  , Canvas.GetTop(shadow ));//将控件放到新的位置   
  60.         }   
  61.     }   

    这里说明下,文章中的鼠标移动到透明背景窗体与鼠标移出控件是一样的原理,只要在mouseDown的时候强制捕获鼠标,UP的时候取消捕获即可。


你可能感兴趣的:(c,null,UP,WPF,WinForm)