样式和资源字典能在一定范围上设置界面的属性效果,但是这些都是相对的是静态的,即使是动态的,也是先定义好的,无法直接按人的操作行为去设置效果。
这里来实现拖动功能,需要引用System.Windows.Interactivity.dll程序集
一,创建行为
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows; 7 using System.Windows.Controls; 8 using System.Windows.Input; 9 using System.Windows.Interactivity; 10 using System.Windows.Media; 11 12 namespace CustomsXW 13 { 14 public class DragInCanvasBehavior : Behavior<UIElement> 15 { 16 private Canvas canvas; 17 18 protected override void OnAttached() 19 { 20 base.OnAttached(); 21 22 //鼠标左键按下,移动,左键松开 事件 23 this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown; 24 this.AssociatedObject.MouseMove += AssociatedObject_MouseMove; 25 this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp; 26 } 27 28 protected override void OnDetaching() 29 { 30 base.OnDetaching(); 31 32 33 this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown; 34 this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove; 35 this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp; 36 } 37 38 // 是否拖动中 39 private bool isDragging = false; 40 41 // 鼠标点位置元素 42 private Point mouseOffset; 43 44 private void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 45 { 46 // 获取画板 47 if (canvas == null) canvas = VisualTreeHelper.GetParent(this.AssociatedObject) as Canvas; 48 49 // 开始拖动准备 50 isDragging = true; 51 52 //获取当前元素的点位置,默认右上坐标0,0 53 54 mouseOffset = e.GetPosition(AssociatedObject); 55 56 // 捕获鼠标 57 AssociatedObject.CaptureMouse(); 58 } 59 60 private void AssociatedObject_MouseMove(object sender, MouseEventArgs e) 61 { 62 if (isDragging) 63 { 64 // 拖动中,一直实时获取画板的点位置 65 Point point = e.GetPosition(canvas); 66 67 // 实时在画板的上设置元素点位置 68 AssociatedObject.SetValue(Canvas.TopProperty, point.Y - mouseOffset.Y); 69 AssociatedObject.SetValue(Canvas.LeftProperty, point.X - mouseOffset.X); 70 } 71 } 72 73 private void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 74 { 75 if (isDragging) 76 { 77 //移动结束,松开鼠标,释放捕获鼠标 78 AssociatedObject.ReleaseMouseCapture(); 79 isDragging = false; 80 } 81 } 82 } 83 }
二,使用行为
记得要引用
1 <Window x:Class="WPFdemo13.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WPFdemo13" 7 mc:Ignorable="d" 8 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 9 xmlns:custom="clr-namespace:CustomsXW;assembly=CustomsXW" 10 Title="MainWindow" Height="350" Width="525"> 11 <Grid> 12 <Canvas> 13 <Rectangle Height="30" Width="30" Stroke="Black" Fill="Red"> 14 <i:Interaction.Behaviors> 15 <custom:DragInCanvasBehavior></custom:DragInCanvasBehavior> 16 <!--有时候初次加载一直会提示错误,需要重启--> 17 </i:Interaction.Behaviors> 18 19 </Rectangle> 20 21 </Canvas> 22 23 </Grid> 24 </Window>
效果: