WPF学习笔记-行为

样式和资源字典能在一定范围上设置界面的属性效果,但是这些都是相对的是静态的,即使是动态的,也是先定义好的,无法直接按人的操作行为去设置效果。

这里来实现拖动功能,需要引用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 }
View Code

二,使用行为

记得要引用

 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>
View Code

效果:

原文地址:https://www.cnblogs.com/anyihen/p/12961587.html